2

重複の可能性:
cout << c++ << c; の正解は?

私は次のコードを持っています -

int a= 7;
const int &b = a;
int &c = a;

私が使用する場合

cout << endl << ++c << '\t' << a << '\t' << b << '\t' <<  c;

それは印刷します

"8 7 7 8"

ただし、使用する場合

cout << endl << a << '\t' << b << '\t' << ++c << '\t' << a << '\t' << b << '\t' <<  c;

それは印刷します

"8 8 8 8 8 8"

これはどのように正確に起こりますか?それは最適化に関連するものですか?? はいの場合、ideone.com でオフにするにはどうすればよいですか ???

4

2 に答える 2

3

実質的に operator<< は関数呼び出しであり、c++ は関数に渡された引数を任意の順序で評価することが許可されているため、コンパイラによって ++c inc が最初に、非常に合法的に実行されます。

興味深いことに、私のコンパイラは印刷します

8       8       8       7       7

一部のコンパイラは関数パラメーターの評価順序のスイッチを提供しますが、本当にそれを使用する必要がある場合は、コードにもっと問題があるため、その理由を自問し、代わりに移植可能な方法で記述します。

于 2012-10-02T02:48:57.130 に答える
2

ab、およびcはすべて同じオブジェクトです。ただし、関数の引数が評価される順序は定義されていません。したがって、コンパイラが最初に評価することを選択したものは何でも問題ありません。2番目の式では、++c最初に評価されるようです。問題を回避する方法は、式の残りの部分で変更を折りたたまないことです。つまり、c出力の前または後にインクリメントします。

于 2012-10-02T02:51:08.183 に答える