0

私はCを初めて使用します.Cでインクリメント演算子プログラムを持っています

#include<stdio.h>
main(){
  int a, b;
  a = 2;
  b = a + ++a + ++a;
  printf("%d", b);
  getchar();
}

出力は 10 です。誰かが出力が 10 になる方法を説明できますか。

4

2 に答える 2

6
a + ++a + ++a;

この動作は未定義です。コンパイラは、これを 2 + 4 + 4 または 3 + 3 + 4 と評価するコードを生成する可能性がありますが、インクリメントとアクセスの任意の組み合わせ/順序は「有効な」結果です。

于 2011-07-21T16:44:43.000 に答える
3

これは定義++iされておらず、任意の順序で発生する可能性があります。

関数呼び出しの引数もあいまいに評価されfoo(++i,++i)ます。

すべての演算子チェーンが未定義というわけではありませんa||b||c。たとえば、左から右への順序であることが保証されています。

保証は、シーケンス ポイントと呼ばれる場所で行われますが、この用語は C++0x では廃止され、明確化されています。

あなたの例で奇妙なのは、2 + 3 + 4も4 + 4 + 3も発生していないため、コンパイラは一方のステップで左側を最初に評価し、もう一方のステップで右側を最初に評価したことです。これはおそらく、依存グラフを平坦化するための最適化でした。

于 2011-07-21T16:44:27.600 に答える