[解決済み] 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<<E2
とE1>>E2
の全ての値計算と副作用はE1
のすべての値計算と副作用の前にシーケンスされます。E2
.
つまり、結果を生成するためのコードが必要です。
b
を出力する、つまり
01
.
参照 P0145R3 Idiomatic C++のための式評価順序の改良 を参照してください。
関連
-
[解決済み】「Expected '(' for function-style cast or type construction」エラーの意味とは?
-
[解決済み】エラー:free(): 次のサイズが無効です(fast)。
-
[解決済み】 while(cin) と while(cin >> num) の違いは何ですか?)
-
[解決済み] explicit キーワードの意味は?
-
[解決済み] ルール・オブ・スリーとは?
-
[解決済み] コピーアンドスワップ慣用句とは?
-
[解決済み] なぜテンプレートはヘッダーファイルでしか実装できないのですか?
-
[解決済み] スマートポインターとは何ですか?
-
[解決済み] ムーブセマンティクスとは何ですか?
-
[解決済み】C/C++の"-->"演算子とは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】コンストラクターでのエラー:識別子を期待されますか?
-
[解決済み】C++でint型に無限大を設定する
-
[解決済み】致命的なエラー LNK1169: ゲームプログラミングで1つ以上の多重定義されたシンボルが発見された
-
[解決済み] 非常に基本的なC++プログラムの問題 - バイナリ式への無効なオペランド
-
[解決済み】デバッグアサーションに失敗しました。C++のベクトル添え字が範囲外
-
[解決済み】Visual C++で "Debug Assertion failed "の原因となる行を見つける。
-
[解決済み】リンカーエラーです。"リンカ入力ファイルはリンクが行われていないため未使用"、そのファイル内の関数への未定義参照
-
[解決済み】#include<iostream>は存在するのですが、「識別子 "cout "は未定義です」というエラーが出ます。なぜですか?
-
[解決済み】Enterキーを押して続行する
-
[解決済み】警告 - 符号付き整数式と符号なし整数式の比較