ホームページ  >  記事  >  バックエンド開発  >  C で `main()` を再帰的に呼び出すことは許可されていますか?

C で `main()` を再帰的に呼び出すことは許可されていますか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-01 07:03:01583ブラウズ

Is Recursively Calling `main()` in C   Allowed?

C で main() を再帰的に呼び出すことはできますか?

以下のコード スニペットは、C で main() を再帰的に呼び出す興味深い動作を示しています。 .

<code class="cpp">#include <iostream>
#include <cstdlib>

int main() {
    std::cout << "!!!Hello World!!!" << std::endl;
    system("pause");
    return main();
}</code>

コードは正常にコンパイルされ、実行すると「Hello World!!!」と表示されます。無期限に。ただし、この動作は C の標準に準拠していないことに注意することが重要です。 C 標準では、main() を再帰的に呼び出したり、そのアドレスを取得したりすることを明示的に禁止しています。

しかし、実際には、Linux g コンパイラなどの一部のコンパイラでは、main() 内での main() の呼び出しが許可されています。この寛容性は、次のコードで明らかです:

<code class="cpp">#include <cstdlib>
#include <iostream>
using namespace std;
int main()
{
    int y = rand() % 10;
    cout << "y = " << y << endl;
    return (y == 7) ? 0 : main();
}</code>

このコードが実行されると、それぞれの後続の main() 呼び出しから一連の "y" 値 (例: 3、6、7) が生成されます。 .

コンパイルされたアセンブリを分析すると、main() が他の関数と同じように呼び出されていることがわかります。

<code class="assembly">main:
...
cmpl    , -12(%rbp)
je      .L7
call    main
...
.L7:
...
leave
ret</code>

標準では禁止されているにもかかわらず、g はそのような呼び出しを許容しているようです。ただし、この動作は保証されていないため、プログラマは移植性と C 標準への準拠を確保するためにこの動作に依存しないようにする必要があります。

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。