C++のmain()関数におけるreturn文とexit()の違いを徹底解説
プログラマーであればコードを書き、コードを書くなら関数を使い、関数を使う以上、必ずreturn文やexit文に触れることになります。この記事では、return文とexit文がそれぞれどのような役割を持つのか、そして両者の違いについて詳しく解説していきます。
C++における基本的な動作
- returnは、実行フローの制御を呼び出し元の関数へ返すステートメントです。
- exitは、使用されたその時点でプログラムを終了させるステートメントです。
int main()とは
main()関数はプログラムの実行開始点となる場所です。プログラムはmain()関数から実行され、戻り値の型がintであるため、何らかの整数値を返す必要があります。この整数値はプログラムの状態(ステータス)を表しており、0はプログラムが正常に実行されたことを意味します。一方、0以外の値はコード内で実行エラーが発生したことを示します。
main()関数内でのreturn文
return文は、常に実行フローの制御を呼び出し元の関数へ返します。returnはint型の終了コードを使用して呼び出し元に値を渡します。main関数内でreturn文を使用することは、ステータスコードとともにプログラムを終了することを意味します。例えば、「return 0」はオペレーティングシステムへステータスコード0を返すことを意味します。それでは、return文を使用したC++プログラムの例を見てみましょう。
サンプルコード
#include <iostream>
using namespace std;
class Test {
public:
// コンストラクタの動作確認用
Test() {
cout<<"Hey this is Return Constructor \n";
}
// デストラクタの動作確認用
~Test() {
cout<<"Hey this is return Destructor";
}
};
int main() {
// Testクラスのオブジェクト生成
Test object;
// main内でreturnを使用
return 0;
}
実行結果
Hey this is Return Constructor
Hey this is return Destructor
上記のプログラムの実行結果から、returnはクラスオブジェクトのコンストラクタとデストラクタの両方を呼び出していることがわかります。デストラクタの呼び出しは、確保されたメモリを解放するために非常に重要です。
main関数内でのexit()
exit()文は、使用されたその時点でプログラムを終了させます。main関数内でexitキーワードを使用すると、ローカルスコープのオブジェクトに対するデストラクタを呼び出さずにプログラムを終了します。つまり、生成されたオブジェクトは破棄されず、メモリも解放されないまま、プログラムが強制的に終了します。
サンプルコード
#include <iostream>
using namespace std;
class Test {
public:
// コンストラクタの動作確認用
Test() {
cout<<"Hey this is exit Constructor \n";
}
// デストラクタの動作確認用
~Test() {
cout<<"Hey this is exit Destructor";
}
};
int main() {
// Testクラスのオブジェクト生成
Test object;
// main内でexit()を使用
exit(0);
}
実行結果
Hey this is exit Constructor
このプログラムの出力結果から、exitキーワードを使用した場合、確保されたメモリやローカルスコープのオブジェクトを破棄するためのデストラクタが呼び出されないことが確認できます。
まとめ
この記事では、return文とexit文の違いについて解説しました。両者の挙動の違いから、どちらを選ぶかによってプログラムの動作に大きな差が生まれることがわかります。特に、returnの代わりにexitを使用する場合は十分な注意が必要です。短いコードでは影響が見えにくいものの、実際のソフトウェア開発においてはメモリリークなどの深刻な問題につながる可能性があります。本記事が皆様の学習の一助となれば幸いです。
-
【C++】条件文を使わずに偶数・奇数を判定して出力する2つの方法
はじめにこの記事では、比較演算子(<、<=、!=、>、>=、==)などの条件文を一切使わずに、数値が偶数か奇数かを判定して出力するC++プログラムの書き方を解説します。通常、偶数・奇数の判定は条件文を使えば簡単です。数値を2で割った余りが0なら偶数、そうでなければ奇数と判断できます。あるいは、数値と1のビットごとのAND演算を行い、結果が0なら偶数、1なら奇数と判定することも可能です。しかし今回は条件文が使用できないため、少し工夫が必要になります。ここでは、考え方の異なる2つの方法を紹介します。方法1:文字列配列のインデックスを利用するまずは文字列の配列を活用する方法で
-
C/C++におけるmain()関数の戻り値とは?正しい返し方を解説
main()関数の戻り値の役割main()関数の戻り値は、プログラムがどのように終了したかを示すために使用されます。プログラムが正常に実行された場合は「0」を返します。一方、異常終了(エラー、無効な入力、セグメンテーションフォルトなど)の場合は、通常「0以外」の値を返して終了します。ただし、0以外のコードが具体的にどう解釈されるかについては、標準的な規定は存在しません。独自のステータスコードを定義することも可能開発者は独自のステータスコードを定義し、プログラム内で発生したさまざまな種類の失敗を表現するために利用できます。これにより、呼び出し元のシェルスクリプトや他のプログラムが終了コードを参照