cout の未定義の出力 << << a
コード スニペット:
int a = 0; cout << a++ << a;
では、通常、動作は次と同等であると想定されます:
cout << (a++) << a;
ただし、次の点が欠落しているため、関数の引数評価間のシーケンス ポイントの数に応じて、実行順序は保証されません。コンパイラは std::operator<<<>(std::cout, a ) の前後で a を評価する場合があります。
したがって、正しい解釈は次のとおりです。
cout << ((a++) << a);
これは、インクリメント後の a の値が 2 回目の呼び出しで使用されるため、結果が 未定義 であることを意味します。演算子<<<>.
C 17 修正
C 17 では、ルールが次のように変更されました。
E1 << E2
は次のように評価されます:
std::operator<<<>(std::operator<<<>(E1, E2), E3)
のすべての副作用E1 は E2 よりも前に配列されました。これにより、コード フラグメントが期待どおりの出力「01」を生成するようになります。
以上が`cout の出力がなぜの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。