1. ホーム
  2. c++

[解決済み] cout << a++ << a; の正しい答えは?

2023-01-28 13:40:11

質問

最近、面接で次のような客観的な質問がありました。

int a = 0;
cout << a++ << a;

回答

a. 10

b. 01

c. 未定義の動作

私は選択肢b、つまり出力は"01"になると答えました。

しかし、後で面接官から、正しい答えは選択肢c: undefinedであると聞かされ、驚きました。

さて、私はC++のシーケンスポイントの概念を知っています。次のステートメントでは、動作は未定義です。

int i = 0;
i += i++ + i++;

という文がありますが、私の理解では cout << a++ << a という文は ostream.operator<<() は二度呼ばれ、最初は ostream.operator<<(a++) で、その後 ostream.operator<<(a) .

VS2010コンパイラでも結果を確認しましたが、こちらも「01」と出力されました。

どのように解決するのですか?

思いつくままです。

cout << a++ << a;

として。

std::operator<<(std::operator<<(std::cout, a++), a);

C++では、以前の評価の副作用がすべて シーケンスポイント . 関数引数の評価の間にはシーケンスポイントは存在しません。 a の前に評価される可能性があります。 std::operator<<(std::cout, a++) の前でも後でも評価される。ですから、上記の結果は未定義です。


C++17 の更新

C++17では、ルールが更新されました。特に

シフト演算子式で E1<<E2E1>>E2 の全ての値計算と副作用は E1 のすべての値計算と副作用の前にシーケンスされます。 E2 .

つまり、結果を生成するためのコードが必要です。 b を出力する、つまり 01 .

参照 P0145R3 Idiomatic C++のための式評価順序の改良 を参照してください。