C でのポスト インクリメントと出力の動作
この記事では、出力ストリームのコンテキスト内での C でのポスト インクリメント演算子の動作について説明します。場合によっては、ポストインクリメント操作によって予期しない結果が生じる可能性があります。
問題
次のコード スニペットを考えてみましょう。
<code class="cpp">#include <iostream> using namespace std; main() { int i = 5; cout << i++ << i-- << ++i << --i << i << endl; }</code>
このコードの出力は次のとおりです。シーケンス「45555」は、一見すると意外に思えるかもしれません。後置インクリメント演算子 (i ) は、式で使用された後に変数の値をインクリメントし、最初の出力の結果が「4」になります。ただし、次のポスト デクリメント演算子 (i--) は、変数を直ちにデクリメントして元の値に戻し、2 番目の出力として「5」が生成されます。同じパターンが続き、変数値がさらに 2 回インクリメントされてからデクリメントされ、最終出力として「555」が得られます。
ポスト インクリメントについて
ポストC のインクリメント演算子は、式で使用された変数の値をインクリメントする単項演算子です。これは、演算子が適用された後、変数の値が 1 ずつ増加することを意味します。上記のコード スニペットでは、変数が出力ストリーム (cout << i) で使用された後にポスト インクリメント演算子 (i ) が使用されます。
引数の順序なし評価
単一の式内の複数のポストインクリメント/デクリメント操作の動作は、引数の順序なしの評価の対象となります。これは、演算子の引数が評価される順序が C 標準では指定されていないことを意味します。結果として、そのような式の出力は未定義であり、コンパイラの特定の実装によって異なる場合があります。
未定義の動作
コード スニペットの場合ただし、ポストインクリメント演算子とポストデクリメント演算子の評価順序は定義されていません。これにより、予期しない予測不可能な出力が発生します。このようなコードは未定義の動作を示します。つまり、コンパイラは、コンピュータに火をつけるなど、適切と思われる出力を自由に生成できます (冗談です)。
未定義の動作を避ける
未定義の動作を示すコードの作成は、一貫性がなく信頼性の低い結果につながる可能性があるため、避けることが重要です。ポストインクリメント/デクリメント演算子を使用するときに未定義の動作を回避するには、演算子の間にシーケンス ポイントがあることを確認してください。シーケンス ポイントは、次の式の評価が開始される前に、前の式のすべての副作用が完了するコード内のポイントです。
以上がコードが「cout」になるのはなぜですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。