5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

チェリー本の2.10真偽値と条件分岐についてもっと詳しく で はまる

Last updated at Posted at 2018-09-22

Rubyを勉強していて真偽値のところではまりました。
検索してもなかなか答えが見つからなかったのでまとめ。

チェリー本の2.10にプログラムのサンプルが書いてあります。

抜粋&追記

1     && 2                #=> 2       //0
1     && 2     && 3       #=> 3       //1
1     && nil   && 3       #=> nil     //2
1     && false && 3       #=> false   //3

nil   || false            #=> false   //4
false || nil              #=> nil     //5
nil   || false || 2  || 3 #=> 2       //6
false || 2                #=> 2       //7

前提条件

  • 式は左から順に評価されます。
  • &&(論理積)左がfalseなら右は評価しない
  • &&(論理積)左が偽であるなら右は評価しない
  • ||(論理和)左がtrue なら右は評価しない
  • ||(論理和)左が真であるなら右は評価しない

というのが存在します。
また、抜粋したプログラムの

1     && 2                #=> 2       //0
nil   || false            #=> false   //4

//0 //4 から分かるように、

  • && でtrue 同士の比較
  • && で真である値どうしの比較
  • || でfalse同士の比較
  • || で偽である値どうしの比較

なら,右側が評価されます。
また、

1     && 2     && 3       #=> 3       //1

この式から分かるように、
論理積の場合は

&&が続く場合、評価がtrueなら式の途中で評価は終わりません。
&&が続く場合、評価が真であるなら式の途中で評価は終わりません。

//1 の式だと

1 && 2 がまず評価されます。
その結果は
//0 で分かるとおり、2 となります。
次に
2 && 3 が評価されて
3 となります。

論理和の場合は

nil || nil || false

の場合 nil と nil が評価されて、右側の nil になります。
の場合 nil と nil が評価されて、右側の nil が評価されます

次に右側にあった nil と false が評価されて、false となります。
次に右側にあった nil と false が評価されて、false が評価されます。

長くなりましたがここから問題を解きます。


1     && nil   && 3       #=> nil     //2

//2 の場合

1 && nil がまず評価されて nil になります。
1 && nil がまず評価されて nil が評価されます。
次に、nil  && 3 を評価しようとしますが、

  • &&(論理積)左がfalseなら右は評価しない
  • &&(論理積)左が偽であるなら右は評価しない

というのがあるので左が偽であるので評価しません。
ここで式が終わるので、答えは nil になります。
たとえこの後に続けて、


1 && nil && 3 && 4 && false

とか書いたとしても nil の時点で評価が終了しているので、なにも起きません。結果は nil になります。
//3の場合


1     && false && 3       #=> false   //3


この場合も//2と考え方は同じです。

false || nil              #=> nil     //5

//5の場合は、//4と同じように考えてください。

最後に

nil   || false || 2  || 3 #=> 2       //6

//6です。

まず nil || false が評価されて false になります。
まず nil || false が評価されて falseが評価されます。
これは

nil   || false            #=> false   //4

をみれば分かります。

次に、 false と 2 を評価して、2 になります。
次に、 false と 2 を評価して、2 が評価されます。
これは、

false || 2                #=> 2       //7

をみればわかります。

最後に2 と 3 を評価しようとしますが

  • ||(論理和)左がtrue なら右は評価しない

というのがあるので、答えは 2 となります。

以上で終了です

ここから下はいろいろぐぐった結果です。見る必要はありません

なんとなくならわかるんですが、ちょっともやっとします。

&&だとtrueだけなら最後に評価したものを表示
||だとfalseだけなら最後に評価したものを表示
&&でfalseがあるとそれを表示
||でtrueがあるとそれを表示

規則性から考えるとこのようになりますがちゃんとした答えが欲しかったので調べました。

論理演算子 ruby でぐぐった結果

論理積
論理積(AND)は演算子「&&」の左辺及び右辺の条件式が共に真の場合のみ全体の式の評価が真となります。

左辺 右辺 全体の式
真 真 真
真 偽 偽
偽 真 偽
偽 偽 偽

となるので最初の例題に当てはめると

1     && 2     && 3       #=> 3       //1
1     && nil   && 3       #=> nil     //2
1     && false && 3       #=> false   //3

まずは//1から
1 && 2 を評価して true
、、、
trueってなんだ!!
なんで結果が3になるんだ
ということで

論理積 でぐぐると

左がfalseなら右は評価しない
という注意書きが出てきます。
それしか出てきませんでした。
逆に左がtrueならは見当たらなかったのですが、trueのときは右側が評価されているようです。(不完全燃焼)
想像なのですが、式は左から順に評価されていきます。
1 + 4 + 3 だと先に1 + 4 を評価して5になって5 + 3が8になるといった感じです。そこから察するに1 && 2 && 3だと、まず1 && 2が評価されてtrue 次に2 && 3を評価してなのかtrueと3を評価してなのかは分かりませんが、その二つを比較して、3。という

論理和
論理和(OR)は演算子「||」の左辺及び右辺の少なくともどちらか一つの条件式が真の場合に全体の式の評価が真となります。

左辺 右辺 全体の式
真 真 真
真 偽 真
偽 真 真
偽 偽 偽

5
2
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?