2016-10-29 8 views
0

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); 
+2

「0」なのは「0」なので –

+2

未定義の動作です。 –

+0

@SamKuhmonenそれは?あなたはそれを説明できますか?それはokと思われます。 – Tibrogargan

答えて

1

あなたはccでこれをコンパイルする場合は、警告取得します:

warning: unsequenced modification and access to 'x' [-Wunsequenced]` 

変数を変更し、printf内の他の場所にアクセスするには、同じ未定義の動作であると論理的結果が得られないであろう、またすべてのコンパイラの結果。

0

@Samiが彼のコメントで述べたように、引数が評価される順序はコンパイラ固有であり、おそらく呼び出し規約に依存します。あなたの場合、x && y引数は++x || !yの前に最初に計算されます。

+0

この場合、引数の順序が重要になりますか? @ EliSadoffのコメントから - '0' && anything is '0' – Tibrogargan

+0

A && BのAとBの順序は、演算子の優先順位のために重要ではありません。例えば、++と!演算子は||より優先度が高いしたがって、常に最初に評価されます – Steztric

+0

はい、それは明らかです(そして、非常に有益です - 私はOPが代わりにそれについて質問したと思います)。これは実際の質問にはまだ答えません - (Eliのコメントは本当に答えです) – Tibrogargan

3
printf("3: %d %d %d %d\n", ++x || !y, x&&y, !z, y); 

++xがあるため||!y前に評価されます。 ++x結果は

0であった。しかし、++x || !yx&&y評価への指定された順序がない場合!yにのみ評価されます。コードにはシーケンスポイントがありません。