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

Patricia Arquette
リリース: 2024-10-26 04:56:30
オリジナル
818 人が閲覧しました

Why is

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!