ホームページ > バックエンド開発 > C++ > C で「i = i」が未定義の動作とみなされるのはなぜですか?

C で「i = i」が未定義の動作とみなされるのはなぜですか?

Mary-Kate Olsen
リリース: 2024-10-25 12:50:02
オリジナル
858 人が閲覧しました

Why is

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート