i = i の未定義の動作
C 標準では、「未定義の動作」を標準で明示的に指定されていない動作として定義しています。これは、コンパイラーが未定義の動作に遭遇した場合、たとえその結果が予測不可能または誤った出力になる場合でも、必要なコードを自由に生成できることを意味します。
未定義の動作の一例は、次のような変数への値の代入です。変更されようとしています。次のコード スニペットを考えてみましょう:
<code class="cpp">i = 3; i = i++;</code>
標準によれば、このコードは未定義の動作を引き起こします。ただし、評価の順序に関係なく、i の最終値は 4 になると想定されることがよくあります。これは必ずしも真ではありません。
コンパイラは、次のいずれかと同等のコードを出力する可能性があります:
<code class="cpp">i = 3; int tmp = i; ++i; i = tmp; i = 3; ++i; i = i - 1; i = 3; i = i; ++i;</code>
最初の 2 つのケースでは、i の最終値は 4 になります。ただし、3 番目のケースでは、i の最終値は 3 になります。
したがって、i の最終値が常に 4 になると仮定するのは誤りです。実際の動作は未定義であり、コンパイラに依存します。
一般的なルールとして、未定義の動作は避けることが最善です。未定義の動作を示すコードに遭遇した場合は、できるだけ早く修正することが重要です。
以上が`i = i ` が C で未定義の動作を引き起こすのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。