-
22-10-2019 - |
質問
次のCコード印刷があるのはなぜですか 12 12 12
int main(int argc, char const *argv[]) {
int a = 2, *f1, *f2;
f1 = f2 = &a;
*f2 += *f2 += a += 2.5;
printf("%i %i %i\n", a, *f1, *f2);
return 0;
}
解決
*f2 += *f2 += a += 2.5;
この行にはあります 未定義の動作 の値を変更するからです *f2
(すなわち a
)介在するシーケンスポイントのない同じ式内の複数回。 UBは、プログラムが「Hello World」を印刷する可能性があることを意味し、クラッシュする可能性があり、印刷する可能性があります 12 12 12
また 12 12 1029
または、脳を食べ始めるかもしれません。未定義の動作に頼らないでください。
C ++標準を引用するには(質問のタグが付けられていることは知っていますが、私はC標準を持っていません。
記載されている場合を除き、個々のオペレーターの手術の評価の順序と個々の表現のサブエクスペッション、および副作用が発生する順序は不特定です。53)表現の評価により、せいぜい一度。さらに、前の値は、保存する値を決定するためにのみアクセスするものとします。この段落の要件は、完全な表現のサブ発現の許容順序ごとに満たされるものとします。それ以外の場合は、動作です 未定義.
他のヒント
あなたが1つだけを指しているので、それはすべてに同じ値を印刷します int
変数: a
.
印刷します 12
なぜなら a + 2.5 = 4
(a
です int
)、そしてそれからあなたはそれを2回自らに追加します。
@downvoters:なぜそんなに否定的なのですか?私の答えは何を言っていると思います このコンパイラ やっています この例コード, 、OPが動作を理解するのに役立つはずです。私はそれに賛成だ Armen Tsirunyanの答えは正しい(つまり、ダニを手に入れるべきだ)、そして 標準に従って動作は未定義です. 。しかし、標準が実装されていますが、コードをコンパイルするコンパイラをまだ見ていませんが、実行時に突然手を投げて言っています Undefined behaviour!
.
私は *f2
と *f1
指し示す a
(整数)。
そう *f2 = &a = 2
と *f1 = &a = 2
この時点で、次の値に追加します 2.5
(なぜなら a
整数です、あなたは取得します 4
).
あなたが持っているよりも
a = 4
f2 = 4
f1 = 4
この時点であなたはそうします f2+f1+a = 12.