2

私はまだ初心者なので、私を気楽にさせて、私を撃たないでください。

私は完全に混乱していて、このコードを実行したときに理由を理解することはできません。

int y = 9;
cout << "++y = " << ++y << "\n--y = " << --y << "\ny++ = " << y++ << "\ny-- = " << y-- << "\n";
cout << "y = " << y << "\n";

次の結果が得られます。

y = 9
++y = 9
--y = 9
y++ = 8
y-- = 9
y = 9

これらの結果の代わりに:

y = 9
++y = 10
--y = 9
y++ = 9
y-- = 10
y = 9

私がこのコードから得たもの:

int y = 9;
cout << "y = " << y << "\n";
cout << "++y = " << ++y << "\n";
cout << "--y = " << --y << "\n";
cout << "y++ = " << y++ << "\n";
cout << "y-- = " << y-- << "\n";
cout << "y = " << y << "\n";

結果をそのように出力するために、最初のコードで何が起こるかを(できるだけ簡単な言葉で)誰かが説明できますか?

4

3 に答える 3

11

簡単なルールは、特定のステートメントで同じ場所を複数回インクリメントすることは期待されていないということです。したがって、(宣言を想定して)cout << y++ << ++y << endl;の 2 つのインクリメントを含むコードを作成しないでください。yint y;

詳細については、C++標準のシーケンス ポイント未定義の動作についてお読みください。

関連する質問がたくさんあります。詳細については、それらを調べてください。

于 2012-01-19T20:07:20.440 に答える
3

規則上、操作 * を + の前に数え、++ を * の前に数える場合は、そのようになります。

 a*b++ + c // first b++ (returns **old** b), than a*b, than ...+c

しかし、a++ * a-- がある場合、2 つのオペランド a++ と a-- のどちらが最初に評価されるかは誰にもわかりません。ANSII 標準によると、同じトランスレータを使用しても、結果は毎回予測できません。

C++ ANSII 標準から引用します。

特に明記されていない限り、個々の演算子のオペランドと個々の式の部分式の評価の順序、および副作用が発生する順序は規定されていません。前のシーケンス ポイントと次のシーケンス ポイントの間で、スカラー オブジェクトの格納値は、式の評価によって最大 1 回変更されます。さらに、保存する値を決定するためにのみ、前の値にアクセスする必要があります。この段落の要件は、完全な式の部分式の許容される順序ごとに満たされる必要があります。それ以外の場合、動作は未定義です。[例:

      i = v[i++];      // the behavior is undefined
      i = 7, i++, i++; // `i' becomes 9

      i = ++i + 1;     // the behavior is undefined 
      i = i + 1;       // the value of 'i' is incremented

シーケンス ポイント:

  • 完全な式の評価の終了時 (完全な式は、式ステートメント、またはより大きな式内の部分式ではないその他の式です)。
  • ||、&&、?:、およびコンマ演算子で。
  • 関数呼び出し時 (すべての引数の評価後、実際の呼び出しの直前)。

|| だから、|| はシーケンス ポイントですが、<< はそうではありません。

于 2012-01-19T20:10:26.397 に答える
2

最初のコードのマルチライン バージョンは次のようになります。

  y = 9;
  cout << "y-- = " << y-- << "\n";
  cout << "y++ = " << y++ << "\n"
  cout << "--y = " << --y << "\n"
  cout << "++y = " << ++y << "\n"
  cout << "y = " << y << "\n";
于 2012-01-19T20:17:46.930 に答える