ホームページ >バックエンド開発 >C++ >cout でポストインクリメント演算子を使用した C プログラムの出力が未定義なのはなぜですか?

cout でポストインクリメント演算子を使用した C プログラムの出力が未定義なのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-06 08:23:02326ブラウズ

Why is the output of a C   program with post-increment operators used in cout undefined?

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 サイトの他の関連記事を参照してください。

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