演算子の優先順位(関係演算子、論理演算子)

演算子が一つだけの場合はいいのですが、複数の演算子を組み合わせて使用する場合にはどの演算子が先に評価されるのかが重要となります。どの演算子が先に評価されるのかは演算子の優先順位に従います。ここでは Ruby における演算子の優先順位について解説します。

(Last modified: )

演算子の優先順位

Ruby で用意されている演算子の優先順位は次の通りです。

(優先順位が高い)
  !  ~
  **
  *  /  %
  +  -
  <<  >>
  &
  |  ^
  >  >=  <  <=
  ==  !=
  &&
  ||
  ..  ...
  ?:
  =
  not
  and  or
(優先順位が低い)

最も高い優先順位を持つのが !~ です。逆に最も低い優先順位を持つのが andor です。

特に否定の ! 演算子は優先順位が高いため注意が必要です。例えば変数の値が 20 より大きいかどうか調べ、その結果を否定する場合を考えてみます。

num = 10

if !num > 20 then
  puts("20以下です")
end

上記のように記述してしまうと、まず変数「num」に対して否定演算子 ! による演算が行われます。変数「num」には 10 が入ってるため「!num」は false となります。そして false が 20 より大きいのかどうか調べようとしますが false の元のクラスである FalseClass には > メソッドが無いため結局エラーとなってしまいます。

このような場合は先に評価を行わせたい部分を括弧 () で括ることで、意図したとおりの順序で演算子による演算が行われるようにします。

num = 10

if !(num > 20) then
  print("20以下です")
end

この場合はまず括弧で括られた変数「num」が 20 よりも大きいかどうかを調べ falseとなります。その結果に対して否定演算子 ! による演算が行われので式全体は true となります。

論理演算子の &&|| は関係演算子の ==>= などより優先順位が低くなっています。次の例を見てください。

num = 10

if num > 5 && num < 30 then
  print("5より大きく30より小さい")
end

上記の場合は && よりも先に「num > 5」と「num < 30」の演算が行われます。これは && 演算子の優先順位が >< より低いためです。

>< のように同じ行の演算子は優先順位が同じです。演算子が同じ優先順位の場合は、どちらから先に演算を行っても同じ結果となります。

サンプルコード

では簡単なプログラムで確認してみます。

# encoding: UTF-8

num = 10
if ! num > 20 then
  puts("20以下です")
end

下記のように実行して下さい。

演算子の優先順位(関係演算子、論理演算子)

今回は括弧を記述していないため FalseClass> メソッドが無いというエラーが発生します。

では少しプログラムを変更してみます。

# encoding: UTF-8

num = 10
if ! (num > 20) then
  puts("20以下です")
end

下記のように実行して下さい。

演算子の優先順位(関係演算子、論理演算子)

今回は意図した順番で演算子が演算されたため、エラーもなく結果が表示されました。

-- --

Ruby における演算子の優先順位について解説しました。

( Written by Tatsuo Ikura )

Profile
profile_img

著者 / TATSUO IKURA

プログラミングや開発環境構築の解説サイトを運営しています。