多くのプログラミングでandまたは&&などの論理演算子が使えますが、Rubyではandと&&の両方が使えます。しかし、その機能は同じではありません。混在して使った場合、意図したとおり動作しないことがあります。
Rubyでは演算子の優先準備が決まっており、これを知らないとプログラムが作れません。今回は、andと&&の優先順位の違いから、Rubyらしい論理演算子の使い方について解説します。
- Rubyの論理演算子ではtureとfalseを扱う
- Rubyの演算子には順序があり、&&は高くandは低い
- Rubyではandの優先順位は=よりも低いので注意
論理演算子の基本
論理演算子とは、プログラミング言語の条件分岐などに使われるandやorなどの論理演算を指示するための演算子です。なお、この場合の論理とは、trueとfalseの2つの値のことです。
そして、tureとfalseの2つの値を扱い、否定(not)、論理和(or)、論理積(and)の3つの演算に使われるのが、論理演算子です。次から、Rubyの論理演算子の基本について解説します。
Rubyで使える論理演算子
論理演算子は、プログラム言語によっても違いますが、Rubyでは次の3つが使えます。
否定を表す「!」。使い方は「!a」で、aがtrueならfalseを返し、aがfalseならtrueを返します。
論理和を表す「||」。使い方は「a || b」で、aとbのどちらかがtrueならtrueを、両方がfalseならfalseを返します。
論理積を表す「&&」。使い方は「a && b」で、aとbの両方がtrueならtrueを、どちからがfalseならfalseを返します。
論理演算子&&の使用例 a = true b = false if a && !b then puts "a && !b = true" end if a || b then puts "a || b = true" end
Rubyではandとorも使える
Rubyでは、先ほど説明した&&と||の他に、andとorも使えます。さらに、否定を表す!の代わりに、notで代用することも可能です。
andとorを使った例 a = true b = false if a && !b then puts "a && !b = true" end if a || b then puts "a || b = true" end
&&とandは同じではない
上記のように、Rubyには、同じように使える2つの論理演算子があります。しかし、「&&」と「and」は、厳密には同じではありません。この違いを知らないで使ってしまうと、プログラムの不具合の原因になるので、注意が必要です。
なお、Rubyの公式サイトのマニュアルには、次のように紹介されています。
(ここから引用)
左辺を評価し、結果が偽であった場合はその値(つまり nil か false) を返します。左辺の評価結果が真であった場合には右辺を評価しその結果を返します。andは同じ働きをする優先順位の低い演算子です。
Rubyにおける演算子の順序
多くのプログラム言語では、演算子の優先度が決められており、その順序で計算等を実施します。例えば、掛け算と足し算が混じった式を計算する場合、先に掛け算を計算し、その後、足し算を計算します。
そしてRubyにも、この演算子の順序が決められており、&&は優先度が高く、andは優先度が最低です。この違いについて解説します。
Rubyの演算子の優先順位
Rubyの演算子の優先順位は、次のように定義されています。
[優先順位が高い]
::
[]
+(単項) ! ~
**
-(単項)
* / %
+ –
<>
&
| ^
> >= < <=
== === != =~ !~
&&
||
.. …
?:(条件演算子)
=(+=, -= … )
not
and or
[優先順位が低い]
これを見てもらうと解るように、論理演算子で最も優先されるのは否定「!」です。そのため、それより低い「&&」や「||」と組み合わせた場合、先に「!」が演算されてから、次に「&&」や「||」が演算されます。
否定が先に適用される例 a && !b
この例では、先に否定の「!b」が演算され、次にその結果と「a」の「&&」が演算されますまた、notとandやorの関係も同じで、先にnotが演算され、次にandやorが演算されるのが理解できるでしょう。
優先度の違いにより&&とandの結果が違う
先ほど、Rubyには同じ論理積を表す「&&」と「and」の論理演算子があり、この2つの優先度は違います。特に、andとorは、代入を意味する=よりも優先度が低いことから、それが原因で演算結果が違ってしまうことがあります。次から、論理演算の結果が違ってしまう例を紹介します。
andの結果が代入されない
先ほどRubyの演算子の優先順位で紹介した演算子の優先順位を見てもらうと、andやorより上に「=」があります。そのため、「=」とandが同じステートメントに記述された場合、先に=が実行されてしまいます。
例えば、下記の論理演算子&&を使った例では、&&の演算結果が=によって代入されます。しかし、&&の代わりにandを使うと、優先順位が=より下なので、演算結果が代入されません。
論理演算子&&による演算結果を代入する例 val = true && false
この場合、valには、trueとfalseの論理積、つまりfalseが代入されます。
論理演算子andによる演算結果を代入する例 val = true and false
この例では、andより先に=が実行されるので、valにはtrueが代入され、その後にandが実行されます。
条件演算子で結果が異なる
先ほどRubyの演算子の優先順位で紹介した演算子の優先順位を見てもらうと、論理演算子の&&とandの間に、条件演算子があるのに気が付かれたでしょうか。もし、条件演算子で論理演算子の&&とandを使った場合、結果が違うことがあるので注意が必要です。
&&を使った条件演算子の例 v1 = 15 v2 = 20 flg = (v1 > 10) && (v2 > 10) ? "OK" : "NG" puts flg
この例では、変数v1とv2を比較した結果が両方trueになるので、flgに”OK”が格納されます。
andを使った条件演算子の例 v1 = 15 v2 = 20 flg = (v1 > 10) and (v2 > 10) ? "OK" : "NG" puts flg
先ほどと同じですが、&&の代わりにandを使ったことで、まず「flg = (v1 > 10)」が、次に「(v2 > 10) ? “OK” : “NG”」が実行され、最後にそのandが実行されます。その結果、flgに格納されるのはtrueです。このように、&&とandでは結果が違ってしまうので注意してください。
同じ結果にするなら括弧で囲む
多くのプログラム言語にも演算子の優先順位が決められており、優先度の低い演算を先にやりたい場合は、括弧で囲みます。そして、この書き方はRubyでも有効で、括弧があると、その中の演算を先に実行します。
例えば、先ほど、&&とandの結果が違っていた式は、次のように書くことで、andの演算を先に実行します。
括弧を使ったandの演算例 val = ( true and false )
この場合、括弧内のandの演算結果がfalseなので、valにはfalseが格納されます。
Rubyを学びたい方におすすめのスクールはこちら
まとめ
これまで解説したように、Rubyにおける&&とandは同じ論理積を演算する論理演算子ですが、他の演算子と組み合わせた場合、優先度の違いで結果が違ってしまいます。そのため、同じように使っていると、不具合の原因になるので注意してください。
ただし、括弧で囲むことで、同じ結果にすることは可能です。論理演算子の優先順位を正しく理解してRubyのプログラミングに活用してください。
また、Rubyについてもっと詳しく学びたい方は、ポテパンキャンプの利用を検討されてはいかがでしょうか。
Rubyを学びたい方におすすめのスクールはこちら