質問: ++c || (++b && ++z) (++b && ++z) こちらが最初に実行されるのではないのですか?? ++c && ++b && ++z → (++c && ++b) && ++z こちらも、左側が0以外なら右は評価しないのでしょうか?? ++c && ++b || ++z → (++c && ++b) || ++z
回答: 結合順位と評価順序は違います。 簡単な例として`a || b && c`を挙げますと、 !イメージ説明 図にかけばいいというものでもないですが・・・ 「演算子の結合順位」は特定の式がどの式と演算されるのかを決めますが、それは式の全体の実行順序ではありません。この絵でいうと木の末端に近い方が「結合順位が高い演算」です。優先順位が一番高い演算子(ここでは&&)から枝が出て左右のオペランドがその下にぶら下がると考えてください。 一方「実行順序」はこの絵でいう木の根元から末端へ、左から右への順番になります。ごちゃごちゃしてしまってわかりにくくなってしまいましたが赤の線で書いたように「深さ優先」で木を順番に辿って行って実行(式の評価)が行われます。 なにか、計算機の教科書でこんなような図をみた気がします・・・ 追記:あ・・・大事なことを言い忘れました。この実行順序は「考えやすさ」のためにこう書いてますが、このように評価したときと同じ結果になるのであればコンパイラーが勝手に演算順序を変えてしまうこともあり得たと思います。しかし、言語仕様で決まった意味を変えるような滅茶苦茶な変え方はもちろんしません。 追記2: Cの演算順序の「仕様」についてはmaisumakunさんがコメントされていることが正確と思います。この絵は「結合優先度」「演算順序」が一致しない点を示すことを意図したものであることをご承知おきください。つまり分かりやすさを意図しています。