ホームページ > バックエンド開発 > C++ > C で「main()」を再帰的に呼び出すと未定義の動作が発生するのはなぜですか?

C で「main()」を再帰的に呼び出すと未定義の動作が発生するのはなぜですか?

Barbara Streisand
リリース: 2024-12-31 01:40:13
オリジナル
506 人が閲覧しました

Why Does Recursively Calling `main()` in C   Lead to Undefined Behavior?

C での Main の再帰呼び出し : 未定義領域への旅

以下に示す難解なコード スニペットは、プログラミング コミュニティ内で好奇心を呼び起こしました。

int main () { 
    return main(); 
}
ログイン後にコピー

多くの人が驚いたことに、このコードはコンパイルされます。成功しました。ただし、実行すると、無期限に実行されるという興味深い動作が明らかになります。この奇妙な観察により、基礎となる仕組みに関する疑問が生じています。

Main 呼び出しのジレンマ

C 標準は [basic.start.main] p3 で次のように明示的に宣言しています。関数 main には式を使用して名前を付けることはできません。」この禁止事項は、ランタイム ライブラリが 1 回呼び出す、プログラムのエントリ ポイントとしての main の性質に由来します。それ以降の main への呼び出しは許可されないため、名前付き式が欠落します。

コンパイラーの動作と未定義の動作

[intro.compliance.general] によると、コンパイラの義務は、整形式のプログラムから実行可能コードを生成することです。警告やエラーが表示される場合がありますが、すべてのルールを強制する必要はありません。この特定のケースでは、コンパイラは main 呼び出しの違反に対して異なる対応をする裁量権を持っています。

未知を受け入れる

最終的には、この動作に関する決定的な判断が下されます。コード スニペットは未定義の動作の範囲内にあります。標準の定義によれば、未定義の動作が発生すると、あらゆることが起こる可能性があります。そのような結果を合理化しようとする試みは、結果がまったく予測できないため無駄です。

結論として、提示されたコードの構文は有効ですが、その実行により未定義の動作が発生します。プログラムが未知への予期せぬ旅に出ないように、main を呼び出す名前付き式に対する標準の禁止事項に注意することが最善です。

以上がC で「main()」を再帰的に呼び出すと未定義の動作が発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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