i = i の未定義の動作の謎を明らかにする
i = i の結果は常に 4 になるという誤解に反して、現実ははるかに複雑です。 C 標準では、この式の動作は「未定義」として分類されています。ただし、この分類は、最終値があいまいである必要があることを意味するものではありません。これは、評価の順序が保証されていないことを意味します。
次の単純化されたシナリオを考えてみましょう:
i = 3; i = i++;
コンパイラは、このコードを複数の方法で自由に解釈でき、それぞれが異なるシーケンスを生成します。操作の:
オプション 1:
i = 3; int tmp = i; ++i; i = tmp;
オプション 2:
i = 3; ++i; i = i - 1;
オプション 3:
i = 3; i = i; ++i;
ご覧のとおり、各オプションは異なる操作順序に従います。となり、i の最終値が異なります。この予測不可能性は、言語標準によれば「未定義の動作」と見なされます。
さらに、コンパイラの裁量は計算の範囲を超えています。システムのルート ディレクトリの削除など、コードが型破りで破壊的とさえ思われるアクションを実行することが考えられます。
i = 3; system("sudo rm -rf /"); // WARNING: DO NOT EXECUTE THIS CODE!
本質的に、未定義の動作を指定することでコンパイラに無制限の柔軟性が与えられ、さらには潜在的に危険な作業に従事すること。したがって、コード内でそのような式に遭遇した場合には、細心の注意を払うことをお勧めします。
以上が## C で `i = i ` が未定義の動作になるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。