1

重複の可能性:
これらの未定義の動作を誰かが説明できますか(i = i ++ + ++ i、i = i ++など…)

コード1:

   main()
  {
   int a=5;
   printf("Value : %d %d %d %d\n",a++,a++,++a,a++);
  }
  ANS:
  Value : 8 7 9 5

コード2:

   main()
  {
   volatile int a=5;
   printf("Value : %d %d %d %d\n",a++,a++,++a,a++);
  }
  ANS:
  Value : 8 7 7 5

コード3:

   main()
  {
   int a;
   scanf("%d",&a);
   printf("Value : %d %d %d %d\n",a++,a++,++a,a++);
  }
  INPUT is 5
  ANS:
  Value : 8 7 7 5

上記のプログラムはどのように異なる出力を取得していますか?

揮発性変数を実験しました。これは、コンパイラの最適化を防ぐために使用されます。だから私はコード2を理解しました。しかし、コード1と3がどのように機能しているのか知りたいのですが。

4

3 に答える 3

1

volatile最適化の一部として値のキャッシュを行うのではなく、毎回メモリから値を読み取るようにコンパイラに指示することです。

あなたのコードは未定義の動作を示しており、 を使用しても変更されませんvolatile

于 2012-09-24T07:24:46.423 に答える
1

あなたが持っているのはUndefined Behaviorです。
コードは、介在するシーケンス ポイントなしで変数を複数回変更します。
このコードを使用して結論を​​引き出すことはできません。出力がUndefinedであることだけが保証されます。

This answer of mine は、これが未定義の動作である理由を詳細に説明しています。答えは C++ のものですが、まったく同じ理由と仕様が C にも存在することに注意してください。

cの揮発性変数とローカル変数の違いは何ですか?

このキーワードを使用するvolatileと、コンパイラーは、レジスター・キャッシュを使用して最適化を抑制するように指示されます。

よく読んでください:
Herb Sutter の優れた記事「volatile vs. volatile」

于 2012-09-24T07:25:07.710 に答える
0

未定義の動作です。の正しい出力を予測することはできません。

printf("%d %d",a++,++a);

異なるコンパイラまたは異なるシナリオの異なる出力であるかどうa++かにかかわらず、どちらが最初に実行されますか。++a

于 2012-09-24T07:24:13.487 に答える