未定義の動作: cout について << << a
C では、未定義の動作の概念を理解することが不可欠です。未定義の動作とは、プログラムの動作が C 標準で指定されておらず、予測できない結果が生じる状況を指します。
次のステートメントを考えてみましょう。
cout << a++ << a;
ここにはシーケンスがあります。インクリメント演算子 ( ) と挿入演算子 (<<) を含む演算の例です。これらの操作を変数 a に適用すると、シーケンス ポイントがないために未定義の動作が発生します。
シーケンス ポイントは、すべての副作用が発生したことをコンパイラが保証するコード内の特定のポイントです。ただし、上記のステートメントでは、a と a の評価の間にシーケンス ポイントがありません。これは、これらの操作が実行される順序が標準で指定されていないことを意味します。
その結果、このステートメントの出力は実装によって異なる可能性があります。場合によっては、出力が「01」になることもあれば、「10」になることもあります。ただし、標準ではどのケースが発生するかは保証されていないため、動作は未定義です。
C 17 Update
C での式の評価を管理するルールに注意することが重要です。 C 17 では、次のルールが << のようなシフト演算子式に適用されます。 >>:
"シフト演算子式 E1>E2 では、E1 のすべての値の計算と副作用は、E2 のすべての値の計算と副作用の前に順序付けされます。 ."
このルールは、元のステートメントの未定義の動作を排除します。 C 17 では、ステートメント cout
以上がなぜ「クート」なのかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。