これはshort-circuit evaluationの結果です。
表現++x
は2
と評価され、コンパイラは2 || anything
は、常に関係なくanything
が何であるか(「真」)1
と評価されていないことを知っています。したがって、anything
と評価されず、y
とz
の値は変更されません。
あなたは
x=-1;
y=z=1;
にしようとするとあなたは、コンパイラは、式の結果を判断するためにORの右側を評価する必要があるためy
とz
は、インクリメントされていることがわかります。
編集: asaerlが最初にコメントのあなたのフォローアップの質問に答えたので、ちょうど彼の正解を少し拡大します。
演算子の優先順位は、式を構成する部分の結合方法を決定します。 ANDはORよりも優先順位が高いので、コンパイラがあなたの代わりに
(++x || ++y) && ++z
これは、それが++x
と++y && ++z
間のORを行うことを任務と葉の
++x || (++y && ++z)
を書いたことを知っています。この時点では、通常、標準に従って1つまたは他の式を最初に評価することを「好む」かどうかを自由に選択でき、通常は特定の順序に依存することはできません。この順序は演算子の優先順位とは関係ありません。しかし
、特に||
と&&
のために評価が常には短絡が働くことができるように左から右へ進むと、開発者になることを、標準的な需要が評価の結果ならば評価されていない右辺式にを依存することができますlhsは伝えます。
出典
2012-05-03 13:48:51
Jon
助けてくれてありがとうございましたが、ここで優先順位が決まっていませんか?意味は、++ y && ++ zは最初に評価され、|| ? – krishnang
番号の優先順位は、評価の順序ではなく、解析の順序です。 ところで、 '++ z'が評価されたなら、それはUBでした。 ( 'z'を2回変更する) – asaelr