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

【C/C++】exit()・abort()・assert()の違いと使い方を徹底解説

C言語やC++には、プログラムの実行を途中で終了させるための関数がいくつか用意されています。代表的なものが「exit()」「abort()」「assert()」です。これらはいずれもプログラムを終了させる機能を持ちますが、動作の仕方や用途は大きく異なります。本記事では、それぞれの関数の特徴、構文、具体的な使用例をサンプルコード付きでわかりやすく解説します。

exit()とは

exit()関数は、呼び出された時点でプログラムを即座に終了させ、それ以降の処理を実行しない関数です。終了時にステータス値を親プロセスへ返すことができ、標準ヘッダーファイル「stdlib.h」で宣言されています。戻り値はありません。

C言語におけるexit()の構文は以下の通りです。

void exit(int status_value);

status_value − 親プロセスに返される値です。一般的に、正常終了の場合は「0」、異常終了の場合は「0以外」(例:1)を指定します。

exit()の使用例

#include <stdio.h>
#include <stdlib.h>
int main() {
    int x = 10;
    printf("xの値 : %d\n", x);
    exit(0);
    printf("exit()の呼び出し後");
    return 0;
}

実行結果

xの値 : 10

上記のプログラムでは、変数「x」を初期化し、その値を出力した後にexit()関数を呼び出しています。exit()が呼び出された時点で実行は即座に終了するため、後続のprintf()は実行されず、画面には表示されません。

abort()とは

abort()関数は、プログラムを異常終了させるための関数です。呼び出されるとSIGABRTシグナルが発生し、実行が強制的に中断されます。通常の終了処理には適していないため、プログラムの終了方法として使用することは推奨されていません。「stdlib.h」ヘッダーファイルで宣言されています。

C言語におけるabort()の構文は以下の通りです。

void abort(void);

abort()の使用例

#include <stdio.h>
#include <stdlib.h>
int main() {
    int a = 15;
    printf("aの値 : %d\n", a);
    abort();
    printf("abort()の呼び出し後");
    return 0;
}

実行結果

aの値 : 15

上記のプログラムでは、変数「a」を初期化して値を出力した後、abort()を呼び出しています。abort()が呼び出されると、実行は即座に、しかし異常な形で終了するため、後続のprintf()は実行されません。

assert()とは

assert()関数は「assert.h」ヘッダーファイルで宣言されている関数で、引数として与えられた式を評価します。式が真(true)の場合は何もせず処理を続行しますが、偽(false)の場合はプログラムを異常終了させ、エラーメッセージを出力します。主にデバッグ時に、プログラムの前提条件が満たされているかを確認する目的で使用されます。

C言語におけるassert()の構文は以下の通りです。

void assert(int exp);

exp − 評価したい式です。

assert()の使用例

#include <stdio.h>
#include <assert.h>
int main() {
    int a = 15;
    printf("aの値 : %d\n", a);
    assert(a!=15);
    printf("assert()の呼び出し後");
    return 0;
}

実行結果

aの値 : 15
main: main.c:9: main: Assertion `a!=15' failed.

上記のプログラムでは、変数「a」を初期化して値を出力した後にassert()関数を呼び出しています。assert()は「aが15ではない」という式を評価しますが、実際にはa=15であるため式は偽となり、アサーション失敗としてプログラムが異常終了し、エラーメッセージが表示されます。

3つの関数の比較まとめ

最後に、exit()・abort()・assert()の違いを表にまとめます。用途に応じて正しく使い分けることが重要です。

関数ヘッダーファイル動作主な用途
exit()stdlib.h正常に終了し、ステータス値を親プロセスに返す通常のプログラム終了
abort()stdlib.hSIGABRTシグナルを発生させ、異常終了する回復不能なエラー発生時の強制終了
assert()assert.h条件式が偽の場合に異常終了するデバッグ時の前提条件チェック

プログラムを終了させる場合は、基本的にexit()を使用し、abort()の使用は避けるのが望ましいでしょう。assert()はリリース版ではなく、開発・デバッグ段階でのバグ検出に活用するのが効果的です。

  1. C/C++におけるdo-whileループとwhileループの違いを徹底解説

    本記事では、C言語およびC++におけるdo-whileループとwhileループの基本的な違いについて、コード例を交えながら詳しく解説します。 whileループとは C言語におけるwhileループは、指定された条件が真(true)である限り、対象のステートメントを繰り返し実行する制御構造です。基本構文は以下の通りです。 while(condition) { statement(s); } ここで、statement(s)は単一のステートメントでも複数のステートメントからなるブロックでも構いません。conditionには任意の式を指定でき、0以外の値はすべて「真」とみなされます。ループは条

  2. C/C++のカンマ演算子とは?仕組みと使い方を実例付きで解説

    カンマ演算子の基本カンマ(コンマ)演算子は、複数の式をひとつにつなげるための演算子です。カンマで区切られた式のリスト全体の値は、最も右側にある式の値になります。本質的に、カンマ演算子の役割は、一連の処理を左から右へ順番に実行させることにあります。その際、右端以外の式の値はすべて破棄されます。つまり、最も右側の式の評価結果が、カンマで区切られた式全体の値となるのです。例えば、次のように書くことができます。var = (count = 19, incr = 10, count+1);この式では、まず count に 19 を代入し、次に incr に 10 を代入します。その後 count に 1