ホームページ >バックエンド開発 >C++ >C 式内の複数のポストインクリメントの出力が予測できないのはなぜですか?

C 式内の複数のポストインクリメントの出力が予測できないのはなぜですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-05 21:58:02387ブラウズ

Why is the Output of Multiple Post Increments in a C   Expression Unpredictable?

C でのポスト インクリメントの動作

C では、ポスト インクリメント (例: i ) は変数をインクリメントしますが、元の値を返します。複雑な式では、その動作を理解することが重要です。

次のコードを考えてみましょう:

<code class="cpp">int i = 5;

cout << i++ << i-- << ++i << --i << i << endl;</code>

このステートメントは、結果を出力する前に式 i i-- i --i i を評価します。ただし、評価の順序は定義されていないため、予測できない出力 (例: "45555") が発生します。

シーケンス ポイントのルールを詳しく見てみましょう:

  • シーケンス ポイント: C では、コード内の特定のポイントで保留中の操作の評価が強制されます。これらのポイントには、セミコロン (;)、コンマ (,)、およびステートメントの終わりが含まれます。
  • 未定義の動作: 上記のコードでは、スカラー変数 i に順序付けされていない副作用があります。インクリメント後の操作が原因です。この結果、未定義の動作が発生します。

例:

<code class="cpp">int x = 20, y = 35;

x = y++ + y + x++ + y++;</code>

この式は次の順序で評価されます:

  1. y : y を 36 にインクリメントし、35 (y の元の値) を返します。
  2. x : x を 21 にインクリメントし、20 (x の元の値) を返します。
  3. y : y をインクリメントして、 37 を返し、36 (y の元の値) を返します。
  4. x : x を 22 にインクリメントし、21 (x の元の値) を返します。

したがって、の最終値はx は 126 (35 36 20 21)、y は 37 です。

結論:

C のポストインクリメントを順序付けされていない式で使用すると、未定義の動作が発生する可能性があります。シーケンス ポイントを理解し、シーケンスされていないコンテキスト内の同じ変数に対する副作用を回避することが重要です。

以上がC 式内の複数のポストインクリメントの出力が予測できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。