ホームページ > バックエンド開発 > C++ > C では `main()` を再帰的に呼び出すことができますか?

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

Barbara Streisand
リリース: 2024-11-02 19:23:02
オリジナル
298 人が閲覧しました

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

C で Main 関数を再帰的に呼び出す

提供されたコード スニペットは、 C 内で main() 関数を再帰的に呼び出そうとします。ただし、この動作は厳密な C 準拠では許可されていないことに注意することが重要です。

C では main() の再帰呼び出しは許可されていますか?

C 標準に従って、 main() 関数を含め、関数はそれ自体を直接呼び出すことはできません。この制限は、無限再帰を防止し、プログラムの終了を保証することを目的としています。

g を使用した実際の実装

言語標準にもかかわらず、実際には main() を再帰的に呼び出すことが可能です。 GNU C コンパイラを使用します (g )。 g はこの点に関して標準を厳密に強制するものではなく、再帰的な main() 呼び出しを含むコードのコンパイルと実行を許可します。

サンプル コード

次の変更されたコード スニペットg を使用した再帰 main() 呼び出しを示します:

<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();
}</code>
ログイン後にコピー

このコードをコンパイルして実行すると、次の出力が生成されます:

y = 3
y = 6
y = 7
ログイン後にコピー

アセンブリ分析

このコード用に生成されたアセンブリを調べると、g が再帰的な main() 呼び出しを他の関数呼び出しと同じように扱っていることがわかります。

main:
        ...
        cmpl    , -12(%rbp)
        je      .L7
        call    main
        ...
.L7:
        ...
        leave
        ret
ログイン後にコピー

注:

この動作は g で可能ですが、保証されていないことに注意することが重要です。他のコンパイラは C 標準に厳密に従っており、コンパイル エラーや予期しない動作が発生する場合があります。したがって、再帰的な main() 呼び出しの使用は推奨されません。

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

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