C におけるポストインクリメントの未定義の動作
C では、ポストインクリメント演算子 (i ) は変数の値を次のように増加させます。評価後は1。 cout で挿入演算子 (<<) と組み合わせて使用する場合、演算の順序が重要になります。
プログラム 1
次のコード スニペットを考えてみましょう。
<code class="cpp">#include <iostream> using namespace std; main(){ int i = 5; cout << i++ << i-- << ++i << --i << i << endl; }</p> <p>このプログラムの出力は未定義です。 C 標準によれば、スカラー オブジェクト (i など) の副作用が、同じオブジェクトを使用した別の副作用または値の計算に対して順序付けされていない場合、その動作は未定義です。</p> <p><strong>説明: </strong></p> <p>式 cout <<私は<<私--<< 私は<< --i </p> <ol> <li>i : i を 6 にインクリメントし、5 を返します。</li> <li>i--: i を 5 にデクリメントします。</li> <li> i: i を 6 にインクリメントします。</li> <li>--i: i を 5 にデクリメントします。</li> <li>i: 5 を返します。</li> </ol> <p>ただし、標準では定義されていません。これらの副作用が起こる順序。これは、コンパイラーがそれらを任意の順序で実行できることを意味し、プログラムが実行されるたびに異なる出力が得られる可能性があります。この特定のケースでは、副作用が上記の順序で実行されるため、出力は「55555」になります。</p> <p><strong>プログラム 2</strong></p> <p>次のプログラムも未定義の動作を示します。 :</p> <pre class="brush:php;toolbar:false"><code class="cpp">int x = 20, y = 35; x = y++ + y + x++ + y++; cout << x << endl << y;</code>
このプログラムの予期される出力は 126 と 37 です。ただし、未定義の動作のため、実際の出力はコンパイラーの実装によって異なる場合があります。
の教訓ストーリー:
ポストインクリメントを cout やインクリメントの副作用に依存するその他の操作と組み合わせて使用することは避けることが重要です。代わりに、変数の変更と出力に別の行を使用して、予測可能な動作を保証します。
以上がcout でポストインクリメント演算子を使用した C プログラムの出力が未定義なのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。