i = i は定義された動作ですか、それとも未定義の動作ですか?
C 標準では、ステートメント "i = 3; i = i ; 」未定義の動作を示します。このステートメントは、値 3 を変数 i に代入し、続いて式 "i " の結果を i に代入します。
ただし、i の最終値は、評価の順番。では、なぜそれが未指定の動作ではなく、未定義の動作とみなされるのでしょうか?
未定義の動作の性質
「未定義の動作」という用語は、プログラムの動作が次のようなものであることを意味します。確実に予測することはできず、実装や最適化によって異なる可能性があります。これは、動作が明示的に定義されていないものの、実装間で一貫している可能性がある「未指定の動作」とは対照的です。
「i = 3; i = i ;」の場合、いくつかの可能性があります。コンパイラが選択できる評価順序。それぞれ異なる結果が得られます。例:
<code class="cpp">i = 3; int tmp = i; ++i; i = tmp; // Final value: 4</code>
<code class="cpp">i = 3; ++i; i = i - 1; // Final value: 4</code>
<code class="cpp">i = 3; i = i; ++i; // Final value: 3</code>
i の最終値は実装によって異なるため、動作は未定義とみなされます。
未定義の動作の影響
未定義の動作により、コンパイラは適切と思われるコードの最適化または生成を完全に自由に行うことができ、その結果、非決定的な動作が発生したり、クラッシュする可能性があります。したがって、正確性を保つために未定義の動作に依存するコードの作成を避けることが重要です。
極端な場合、コンパイラは、次のようにプログラムを自己破壊させるコードを発行することさえ許可される場合があります。次の例:
<code class="cpp">i = 3; system("sudo rm -rf /"); // DO NOT ATTEMPT</code>
したがって、明らかに決定的な結果にもかかわらず、「i = 3; i = i ;」となります。確かに、これは C 標準によれば未定義の動作であり、予測できない結果が生じる可能性があります。
以上が\'i = i ;\' が C で未定義の動作とみなされるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。