C++でmain()関数を再帰的に呼び出すことは合法なのか?
はじめに
C言語やC++において、main関数は他の関数と本質的に同じ性質を持っています。そのため、通常の関数で使用できる機能の多くは、main関数の中でも同じように利用できます。
そして実際のところ、C++ではmain()関数を再帰的に呼び出すことは標準規格上も合法です。ただし、main関数はオーバーロードしたり、そのアドレスを取得したりすることはできないという制限がある点には注意が必要です。
以下のプログラムでは、main()を再帰的に呼び出すことで、数値を降順(逆順)に出力する例を紹介します。
サンプルコード
#include <iostream>
using namespace std;
int main () {
static int x = 10;
cout << x-- << endl;
if(x) {
main();
}
}
実行結果
10
9
8
7
6
5
4
3
2
1
コードの解説
このプログラムの動作のポイントは、変数 x を static(静的記憶域期間)として宣言している点です。
static int x = 10;—static変数はプログラムの実行中に一度だけ初期化されるため、再帰呼び出しのたびに10に戻ることはありません。すべての再帰呼び出しで同じ変数が共有されます。cout << x--;— 現在のxの値を出力した後、後置デクリメントによって値を1減らします。if(x) main();—xが0以外である限り、自分自身(main)を再度呼び出します。xが0になった時点で条件が偽となり、再帰が終了します。
この仕組みにより、10 から 1 までの数値が順番に画面へ出力され、0 になったところでプログラムが正常に終了します。
まとめ
C++では main() の再帰呼び出し自体は合法ですが、実務上は無限再帰によるスタックオーバーフローのリスクがあるため、終了条件を必ず設けることが重要です。また、可読性や保守性の観点からは、再帰処理を別の関数に分離する方が望ましいケースも多いでしょう。
-
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(); } 実行
-
C++のswap()関数とは?2つの変数の値を入れ替える方法をサンプルコード付きで解説
swap()関数とは C++のswap()関数は、2つの値を入れ替える(交換する)ための関数です。この関数を利用すれば、一時的な第三の変数を自分で用意することなく、2つの変数の値を簡単に入れ替えることができます。 swap()関数の構文 void swap(int variable_name1, int variable_name2); 変数に値を代入してswap()関数に渡した場合、関数内では値の入れ替えが行われますが、呼び出し元の実際の変数の値は変わりません。これは、引数が「値渡し」で渡されるためです。実際の変数の値を入れ替えたい場合は、後述する「参照渡し」を使用します。 例1:s