Help us understand the problem. What is going on with this article?

【if文での論理演算(演算子の優先順位とついでに短絡評価)】

本日プログラミング学習で、if 文について理解度が高まったので備忘録のために記事にしてみました。

下記条件を満たすコードを記述しなさい(Ruby)

  • aとbには true または false が入る
  • aとb両方とも true または false なら True を表示
  • それ以外は False を表示

回答例

judgement.rb
def judge(a, b)
  if a && b || !a && !b
    puts "True"
  else
    puts "False"
  end
end

a = false
b = false
judge(a, b)

演算子の前知識

true && true ⇒ true
true && false ⇒ false
false && true ⇒ false
false && false ⇒ false
true || true ⇒ true
true || false ⇒ true
false || true ⇒ true
false || false ⇒ false
!true ⇒ false
!false ⇒ true

考え方

正直メソッドの意味が理解できませんでした。
分解して考えていきます!

judgement.rb
a = false
b = false
judge(a, b)

今回はa、bともに false を代入します。
それらを引数に渡し、メソッドを実行していきます。

judgement.rb
  if a && b || !a && !b
    puts "True"
  else

まず優先順位について、「&&」は「||」より優先順位が高いので、以下のように解釈されます。
(Ruby 2.7.0 リファレンスマニュアルより)

judgement.rb
  if (a && b) || (!a && !b)
    puts "True"
  else

aとbを代入します。

judgement.rb
  if (false && false) || (true && true)
    puts "True"
  else

true && true ⇒ true
false && false ⇒ false
であるため下記のようになります。

judgement.rb
  if false || true
    puts "True"
  else

||の場合は
false || true ⇒ true
であるため下記のようになります。

judgement.rb
  if true
    puts "True"
  else

つまり今回の if の中身は true になるので、else は実行されず True が表示されます。

他の条件の場合でも上記の考え方で理解ができました!

短絡評価とは

簡潔に答えると、左辺のみで評価できるもの(例えばfalse && true ⇒ false)は右辺を評価せずに結果を返す事。Ruby 2.7.0 リファレンスマニュアルでは下記のように書いてありました。

  • && 左辺を評価し、結果が偽であった場合はその値(つまり nil か false) を返します。左辺の評価結果が真であった場合には右辺を評価しその結果を返します。
  • || 左辺を評価し、結果が真であった場合にはその値を返します。左辺の評価結果が偽であった場合には右辺を評価しその評価結果を返します。
  • ! 式の値が真である時偽を、偽である時真を返します。

まとめ

! がついている理由は両方 false だった場合、if 文の結果が false となり else が実行されてしまうのを避けるためだったんですね!

結局どんな if 文も今回のように実行されてるんですよね、、、
「 if 文は true か false で条件分岐を全てを判断している」という点をより深く理解することができました!

参考文献

Ruby 2.7.0 リファレンスマニュアル
@gyu-don様の記事(論理演算子(&&, ||)の短絡評価)

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした