私はCを初めて使用します.Cでインクリメント演算子プログラムを持っています
#include<stdio.h>
main(){
int a, b;
a = 2;
b = a + ++a + ++a;
printf("%d", b);
getchar();
}
出力は 10 です。誰かが出力が 10 になる方法を説明できますか。
私はCを初めて使用します.Cでインクリメント演算子プログラムを持っています
#include<stdio.h>
main(){
int a, b;
a = 2;
b = a + ++a + ++a;
printf("%d", b);
getchar();
}
出力は 10 です。誰かが出力が 10 になる方法を説明できますか。
a + ++a + ++a;
この動作は未定義です。コンパイラは、これを 2 + 4 + 4 または 3 + 3 + 4 と評価するコードを生成する可能性がありますが、インクリメントとアクセスの任意の組み合わせ/順序は「有効な」結果です。
これは定義++i
されておらず、任意の順序で発生する可能性があります。
関数呼び出しの引数もあいまいに評価されfoo(++i,++i)
ます。
すべての演算子チェーンが未定義というわけではありませんa||b||c
。たとえば、左から右への順序であることが保証されています。
保証は、シーケンス ポイントと呼ばれる場所で行われますが、この用語は C++0x では廃止され、明確化されています。
あなたの例で奇妙なのは、2 + 3 + 4も4 + 4 + 3も発生していないため、コンパイラは一方のステップで左側を最初に評価し、もう一方のステップで右側を最初に評価したことです。これはおそらく、依存グラフを平坦化するための最適化でした。