「cout << a << a」の謎を明らかにする: 未定義の動作か、それとも予定された 01?
最近のインタビュー、謎めいたコーディングの難題表面化:
int a = 0; cout << a++ << a;
10、01、および謎の「未定義の動作」を含む魅力的な選択肢の中から、インタビュー対象者はシーケンス ポイントの理解を引用して、自信を持って 01 を選択しました。しかし、インタビュアーの反応は驚きでした。正解は、驚くべきことに、未定義でした。
未定義領域の探索
シーケンス ポイントは通常、副作用が完了する前に副作用が完了することを保証します。その後の評価に移ります。興味深いことに、問題のステートメントには引数の評価間にシーケンス ポイントがありません。これは、引数「a」が引数「cout << a 」の前または後に計算できることを意味します。このあいまいさにより結果が予測不能になり、未定義の動作とみなされます。
C 17 の希望の光
コーディング環境は C 17 で変わりました。式の評価を管理するルールが改訂されました。最新のガイドラインでは、シフト演算子式では、最初の引数 (「E1」) のすべての計算と副作用が 2 番目の引数 (「E2」) の計算と副作用よりも前に順序付けされることが明示的に規定されています。
この重要な調整により、問題のコード スニペットを出力 01 に変換します。とらえどころのない未定義の動作は解消され、事前に決定された確実性によって置き換えられました。
P0145R3 の残り火についての詳細な説明
より包括的な理解を求めている人のために、技術文書 P0145R3: 慣用句 C の式評価順序の洗練では、以下について詳しく説明しています。改訂された式の評価順序の複雑な詳細により、C コーディングの進化についての深い洞察が得られます。パラダイム。
以上が「クート」ですの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。