i = i の非決定的動作
C 標準では、式 "i = i " が未定義の動作を引き起こすと規定しています。評価順序に関係なく、「i」の最終値は常に「4」になるため、これにより疑問が生じました。このような動作は、代わりに「不特定の動作」として分類されるべきではないでしょうか?
未定義と未特定
未定義の動作と不特定の動作の区別は重要です。未定義の動作により、コンパイラーは適切と思われる方法でコードを自由に実行できるため、予測不可能な結果やプラットフォーム固有の結果が生じる可能性があります。一方、未指定の動作は、考えられる結果が複数あることを意味しますが、標準ではどの結果が発生するかは指定されていません。
実装の自由
「i = i 」の場合、コンパイラは特定の評価順序に拘束されません。次の同等のコード シーケンスのいずれかを使用できます:
i = 3; int tmp = i; ++i; i = tmp;
i = 3; ++i; i = i - 1;
i = 3; i = i; ++i;
Unpredictable Outcome
一方、'i' の最終値は多くの場合、は「4」であると想定されますが、これは保証されません。コンパイラは、次のような予期しない結果またはプラットフォームに依存する結果をもたらすコードを生成することが許可されています。
i = 3; system("sudo rm -rf /"); // DO NOT RUN THIS COMMAND ANYWHERE!
式の結果を予測する信頼できる方法がないため、この動作は未定義とみなされます。コンパイラーは、'i ' または ' i' のどちらの操作を自由に優先することができ、これにより 'i' の最終値が異なります。
結論
式 "i" = i " は未定義の動作を示し、コンパイラーが C 標準で明示的に定義されていない方法でコードを実行できるようになります。これは、式の結果を確実に予測することができず、コンパイラの実装やシステム構成によって異なる可能性があることを意味します。
以上がC で「i = i」が未定義の動作とみなされるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。