xがインクリメントされたときの結果が「3:1 0 0 4」であるのはなぜですか? なぜ「3:1 1 0 4」ではないのですか?Cの論理式
x=0;y=4;z=3;
printf("3: %d %d %d %d\n", ++x || !y, x&&y, !z, y);
xがインクリメントされたときの結果が「3:1 0 0 4」であるのはなぜですか? なぜ「3:1 1 0 4」ではないのですか?Cの論理式
x=0;y=4;z=3;
printf("3: %d %d %d %d\n", ++x || !y, x&&y, !z, y);
あなたはcc
でこれをコンパイルする場合は、警告取得します:
warning: unsequenced modification and access to 'x' [-Wunsequenced]`
変数を変更し、printf
内の他の場所にアクセスするには、同じ未定義の動作であると論理的結果が得られないであろう、またすべてのコンパイラの結果。
@Samiが彼のコメントで述べたように、引数が評価される順序はコンパイラ固有であり、おそらく呼び出し規約に依存します。あなたの場合、x && y
引数は++x || !y
の前に最初に計算されます。
この場合、引数の順序が重要になりますか? @ EliSadoffのコメントから - '0' && anything is '0' – Tibrogargan
A && BのAとBの順序は、演算子の優先順位のために重要ではありません。例えば、++と!演算子は||より優先度が高いしたがって、常に最初に評価されます – Steztric
はい、それは明らかです(そして、非常に有益です - 私はOPが代わりにそれについて質問したと思います)。これは実際の質問にはまだ答えません - (Eliのコメントは本当に答えです) – Tibrogargan
printf("3: %d %d %d %d\n", ++x || !y, x&&y, !z, y);
++x
があるため||
の!y
前に評価されます。 ++x
結果は
0であった。しかし、++x || !y
対x&&y
評価への指定された順序がない場合!y
にのみ評価されます。コードにはシーケンスポイントがありません。
「0」なのは「0」なので –
未定義の動作です。 –
@SamKuhmonenそれは?あなたはそれを説明できますか?それはokと思われます。 – Tibrogargan