C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++でmain関数は自分自身を呼び出せる?再帰呼び出しの仕組みを解説

C++では、main()関数は自分自身を呼び出すことができます。これは「再帰呼び出し(recursion)」の一例であり、再帰とは関数が自分自身を呼び出すことを指します。以下のプログラムでその動作を確認してみましょう。

サンプルプログラム

#include<iostream>
using namespace std;
int main() {
    static int x = 1;
    cout << x << " ";
    x++;
    if(x == 11) {
        return 0;
    }
    main();
}

実行結果

上記プログラムの出力は次のとおりです。

1 2 3 4 5 6 7 8 9 10

プログラムの解説

それでは、このプログラムの仕組みを詳しく見ていきましょう。

変数xは、main()内で宣言された静的変数(static変数)です。static変数はプログラムの実行期間を通じて値が保持されるため、main()が何度呼び出されても、初期化が行われるのは最初の1回だけです。

処理の流れとしては、まず変数xの値が出力され、その直後にインクリメントされます。続くif文はプログラムの終了条件を設ける役割を果たしています。この条件がなければmain()は無限に自分自身を呼び出し続け、スタックオーバーフローを引き起こしてしまいます。xの値が11になると、return文によってプログラムが正常に終了します。

最後の行にあるmain();という呼び出しが、関数が自分自身を呼び出している箇所(再帰呼び出し)にあたります。該当するコードは以下のとおりです。

int main() {
    static int x = 1;
    cout << x << " ";
    x++;
    if(x == 11) {
        return 0;
    }
    main();
}

利用時の注意点

main()の再帰呼び出しはC++では文法的に許されていますが、実際の開発では推奨されません。再帰処理が必要な場合は、専用の関数を別途定義するほうが、プログラムの構造が分かりやすくなり、可読性や保守性の面でも有利です。あくまで「C++では可能である」という言語仕様の話として理解しておくとよいでしょう。

  1. C++のコンストラクタ内で仮想関数を呼び出すとどうなる?仕組みと注意点を解説

    コンストラクタやデストラクタの中から仮想関数を呼び出すのは危険な操作であり、可能な限り避けるべきです。その理由は、呼び出された仮想関数が派生クラスのものではなく、基底クラス(Base)のものとして実行されてしまうためです。 なぜ基底クラスの仮想関数が呼ばれるのか C++では、各クラスは自分自身の構築処理に入る前に、そのクラス専用の仮想メソッドテーブル(vtable)を先に構築します。この仕組みにより、コンストラクタ内で仮想メソッドを呼び出すと、現時点で有効になっているテーブル、つまり基底クラスの仮想メソッドが呼び出されることになります。 また、その階層に実装がまったく存在しない場合(純粋仮想関

  2. MATLABからPython関数を呼び出す方法を徹底解説

    MATLABでは、バージョン2014b以降からPythonライブラリが標準で利用できるようになりました。そのため、2014b以降のバージョンを使用していれば、MATLAB上で直接Pythonコードを実行することが可能です。PythonモジュールをMATLABで使う基本この機能により、MATLABの中でPythonモジュールを活用できます。特別な設定は一切不要で、使用したいPythonライブラリ名の前に「py」というプレフィックスを付けるだけで呼び出せます。ここでは、Pythonのcalendarモジュールを例に、うるう年の判定を行ってみましょう。py.calendar.isleap(2016)