Rubyにおける論理演算子andと&&の違いについて
  • facebookページ
  • twitterページ
  • 2020.11.27

    Rubyにおける論理演算子andと&&の違いについて

    多くのプログラミングでandまたは&&などの論理演算子が使えますが、Rubyではandと&&の両方が使えます。しかし、その機能は同じではありません。今回は、andと&&の違いから、Rubyにおける論理演算子の使い方について解説します。

    論理演算子の基本

    論理演算子とは、プログラミング言語の条件分岐などに使われる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を返します。

    Rubyではandとorも使える

    Rubyでは、先ほど説明した&&と||の他に、andとorも使えます。さらに、否定を表す!の代わりに、notで代用することも可能です。

    &&とandは同じではない

    上記のように、Rubyには、同じように使える2つの論理演算子があります。しかし、「&&」と「and」は、厳密には同じではありません。この違いを知らないで使ってしまうと、プログラムの不具合の原因になるので、注意が必要です。

    なお、Rubyの公式サイトのマニュアルには、次のように紹介されています。

    (ここから引用)
    左辺を評価し、結果が偽であった場合はその値(つまり nil か false) を返します。左辺の評価結果が真であった場合には右辺を評価しその結果を返します。andは同じ働きをする優先順位の低い演算子です。

    Rubyにおける演算子の順序

    多くのプログラム言語では、演算子の優先度が決められており、その順序で計算等を実施します。例えば、掛け算と足し算が混じった式を計算する場合、先に掛け算を計算し、その後、足し算を計算します。

    そしてRubyにも、この演算子の順序が決められており、&&は優先度が高く、andは優先度が最低です。この違いについて解説します。

    Rubyの演算子の優先順位

    Rubyの演算子の優先順位は、次のように定義されています。

    [優先順位が高い]
    ::
    []
    +(単項) ! ~
    **
    -(単項)
    * / %
    + –
    <>
    &
    | ^
    > >= < <=
    == === != =~ !~
    &&
    ||
    .. …
    ?:(条件演算子)
    =(+=, -= … )
    not
    and or
    [優先順位が低い]

    これを見てもらうと解るように、論理演算子で最も優先されるのは否定「!」です。そのため、それより低い「&&」や「||」と組み合わせた場合、先に「!」が演算されてから、次に「&&」や「||」が演算されます。

    この例では、先に否定の「!b」が演算され、次にその結果と「a」の「&&」が演算されますまた、notとandやorの関係も同じで、先にnotが演算され、次にandやorが演算されるのが理解できるでしょう。

    優先度の違いにより&&とandの結果が違う

    先ほど、Rubyには同じ論理積を表す「&&」と「and」の論理演算子があり、この2つの優先度は違います。特に、andとorは、代入を意味する=よりも優先度が低いことから、それが原因で演算結果が違ってしまうことがあります。次から、論理演算の結果が違ってしまう例を紹介します。

    andの結果が代入されない

    先ほどRubyの演算子の優先順位で紹介した演算子の優先順位を見てもらうと、andやorより上に「=」があります。そのため、「=」とandが同じステートメントに記述された場合、先に=が実行されてしまいます。

    例えば、下記の論理演算子&&を使った例では、&&の演算結果が=によって代入されます。しかし、&&の代わりにandを使うと、優先順位が=より下なので、演算結果が代入されません。

    この場合、valには、trueとfalseの論理積、つまりfalseが代入されます。

    この例では、andより先に=が実行されるので、valにはtrueが代入され、その後にandが実行されます。

    条件演算子で結果が異なる

    先ほどRubyの演算子の優先順位で紹介した演算子の優先順位を見てもらうと、論理演算子の&&とandの間に、条件演算子があるのに気が付かれたでしょうか。もし、条件演算子で論理演算子の&&とandを使った場合、結果が違うことがあるので注意が必要です。

    この例では、変数v1とv2を比較した結果が両方trueになるので、flgに”OK”が格納されます。

    先ほどと同じですが、&&の代わりにandを使ったことで、まず「flg = (v1 > 10)」が、次に「(v2 > 10) ? “OK” : “NG”」が実行され、最後にそのandが実行されます。その結果、flgに格納されるのはtrueです。このように、&&とandでは結果が違ってしまうので注意してください。

    同じ結果にするなら括弧で囲む

    多くのプログラム言語にも演算子の優先順位が決められており、優先度の低い演算を先にやりたい場合は、括弧で囲みます。そして、この書き方はRubyでも有効で、括弧があると、その中の演算を先に実行します。

    例えば、先ほど、&&とandの結果が違っていた式は、次のように書くことで、andの演算を先に実行します。

    この場合、括弧内のandの演算結果がfalseなので、valにはfalseが格納されます。

    まとめ

    これまで解説したように、Rubyにおける&&とandは同じ論理積を演算する論理演算子ですが、他の演算子と組み合わせた場合、優先度の違いで結果が違ってしまいます。そのため、同じように使っていると、不具合の原因になるので注意してください。

    ただし、括弧で囲むことで、同じ結果にすることは可能です。論理演算子の優先順位を正しく理解してRubyのプログラミングに活用してください。



    優良フリーランス案件多数掲載中!
    フリーランスエンジニアの案件をお探しなら
    ポテパンフリーランス

    この記事をシェア

    • Facebookシェア
    • Twitterシェア
    • Hatenaシェア
    • Lineシェア

    関連ワード

    pickup









    ABOUT US

    ポテパンはエンジニアと企業の最適なマッチングを追求する企業です。

    READ MORE