質問

次の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.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top