-3

重複の可能性:
std::coutを使用した引数の評価の順序

私は今それを知っています!これは'cout'の責任があり ますすべてのコード:

#include <iostream>
using namespace std;
int main()
{
   int i = 3;
   cout <<-i++<<endl<<i<<endl<<-(i++)<<endl<<i<<endl;
   return 0;
}

私はVC++6.0を使用してコンパイルし、出力は:です-4 4 -3 3 が、g ++を使用してコンパイルします。出力は:-4 5 -3 5 なぜですか?私はそれらが同じであるべきだと思います:-4 4 -4 4

PS:やってみます:

int main()
{
   int i = 3;
   cout <<-i++<<endl;
   return 0;
}

int main()
{
   int i = 3;
   cout <<-(i++)&lt;<endl;
   return 0;
}

私はそれらを一つずつコンパイルします、結果は同じです:-3 3すべての答えを考えます、私は多分-i ++と-(i ++)をテストする間違いがあります

4

2 に答える 2

6

現在のところ、コードの動作は未定義です。の値を使用し、シーケンスポイント1を介在させずiに変更しています。これにより、未定義の動作が発生します。i

2つの行の結果の違いは、括弧の使用に起因するものではありませ++。これは、最初の行のがの値を変更するという事実に純粋に起因するiため、2番目の行に到達すると、その値が増分されます。

要約すると、未定義の動作があるため、どの出力も完全に合理的で許可されていますが、-4 4 -3 3は非常に合理的で理解しやすいものです。


  1. C ++ 11以降、標準では「シーケンスポイント」というフレーズは使用されなくなりましたが、同じ基本的な意図を説明するために「シーケンス前」や「シーケンス後」などのフレーズが使用されています。いくつのことがこの変更から定義された動作を取得することになりましたが、多くはありません(具体的には、このコードではありません)。
于 2012-12-26T16:00:18.043 に答える
1

2行は同じです

試す

int i = 3;
cout << - i++  << endl << i << endl;
i=3
cout << -(i++) << endl << i << endl;

演算子の優先順位は次のとおりです。

http://en.cppreference.com/w/cpp/language/operator_precedence

また、接尾辞 ++ (使用するもの) は、単項の plus および Minusよりも優先されます。

一方、この Q と A を読む必要があります。

a = i + i++ が未定義で未指定の動作ではないのはなぜですか

あなたの例は実際にはこれと同じです:

(
  (
    (
      cout.operator<<(-(i++))
    ).operator<<(endl)
  ).operator<<(i)
).operator<<(endl);

本質的に、変数を変更して同じ式で使用することは、多くの場合、未定義の動作です。プログラムは何でも実行できます。

于 2012-12-26T15:42:52.560 に答える