標準で禁止されているにもかかわらず、C で `main()` を再帰的に呼び出すことはできますか?

Susan Sarandon
リリース: 2024-10-31 20:26:29
オリジナル
658 人が閲覧しました

Can g   Recursively Call `main()` in C   Despite the Standard Forbidding It?

C で main() を再帰的に呼び出す

C 標準では、main() を再帰的に呼び出すことは許可されていないと規定しています。ただし、g コンパイラではこの慣行が許可されており、次のような異常なコードが許可されています。

<code class="cpp">#include <cstdlib>
#include <iostream>
using namespace std;
int main()
{
 int y = rand() % 10; // returns 3, then 6, then 7
 cout << "y = " << y << endl;
 return (y == 7) ? 0 : main();
}
ログイン後にコピー

実行時:

> g++ g.cpp; ./a.out
y = 3
y = 6
y = 7</code>
ログイン後にコピー

アセンブリ コードを調べると、main が他の関数と同様に呼び出されることがわかります。 :

<code class="assembly">main:
        ...
        cmpl    , -12(%rbp)
        je      .L7
        call    main
        ...
.L7:
        ...
        leave
        ret</code>
ログイン後にコピー

この動作は標準化されていませんが、反対意見がないことからわかるように、g は標準を強制するための緩和的なアプローチをとっているようです。ただし、-pedantic フラグを使用すると、皮肉な警告が発行されます:

g.cpp:8: error: ISO C++ forbids taking address of function '::main'
ログイン後にコピー

以上が標準で禁止されているにもかかわらず、C で `main()` を再帰的に呼び出すことはできますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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