3
int x = 15 ;
printf ( "\n%d \t %d \t %d", x != 15, x = 20, x < 30 ) ;

コードの出力は 1 20 1 ですが、15 == 15 であるため、0 20 1 になるはずです...

「x != 15」の部分に問題があります

4

3 に答える 3

7

で x に新しい値を代入していますx = 20

関数呼び出しの引数リストでは、これらの操作に特定の順序を想定することはできません。

于 2012-06-07T20:36:45.773 に答える
5

私の経験では、ほとんどのC / C ++コンパイラでは、必要な評価の順序についての記述がない場合でも、ほとんどの引数のリストは右から左に処理されます。

動作するコンパイラの数をこのように理解すると、引数のリストは次のように評価されます。

printf ( "\n%d \t %d \t %d", x != 15, x = 20, x < 30 ) ;

(おそらく)次の順序で評価します

x < 30  => 1
x = 20 (assigns x to 20, returning 20) => 20
x != 15 => 1 (because x is now 20)

この評価順序がコンパイラに当てはまる場合は、引数を次のように再配置します

printf ( "\n%d \t %d \t %d", x < 30, x = 20, x != 15 ) ;

降伏する必要があります

1 20 0

20に再割り当てされるx != 15前に比較が行われるためです。x

この演習の教訓は、通常、リスト構成( "a、b、c、d"のようなもの)での割り当てを回避するか、少なくとも同じリスト構成内の割り当てられた変数を読み取らないようにすることです。左または左から右への評価(コンパイラに依存します)。

于 2012-06-07T20:45:21.367 に答える
0

あなたのコードは不特定の振る舞いに悩まされています:式が実行される順序は、標準によって左から右への義務付けられていません。代わりにこれを試してください

int x = 15 ;
int result1 = (x != 15);
int result2 = (x = 20);
int result3 = (x < 30);
printf ( "\n%d \t %d \t %d", result1, result2, result3 ) ;
于 2012-06-07T21:11:03.657 に答える