I. 概要
- assert は、実行時 (プログラムの実行中) に特定の条件をチェックするために使用されるマクロで、プログラムのデバッグ時に非常に役立ちます。これを使用するには、プログラムにヘッダー ファイル「assert.h」をインクルードする必要があります。
- Assert キーワードは、関数の引数として式を実行し、メモリ割り当て中にそれらを評価するために使用されます。したがって、malloc() メソッドを使用して変数を書き込み、計算することができます。
- 式が評価に失敗するか false を返す場合、式はファイル名および実行された行とともにエラーとして返されます。
- 計算が失敗するか false を返す場合、アプリケーションは abort() を実行し、assert() は標準エラー出力にエラー メッセージを表示し、プログラムの実行を中止します。
- 式が成功して true が返された場合、assert 関数は自動的に非アクティブ化されます。
マニュアル
2. 宣言
//表达式可以是任何有效的 C 语言表达式,很多时候它是一个条件。
void assert(int expression or variable);
3. C言語のassert()を無視する
- アサーションは、GCC、C、および C++ コンパイラによって生成されたコードを使用することにより、デフォルトで有効になります。
- Assert ステートメントは、プログラムのコンパイル時に意図しない結果をもたらす可能性があり、assert() 関数を使用したくない場合にコードからすべてのアサーションを削除するのは非常に時間のかかる作業になります。
- C プログラミング言語の実行中にコードからすべての Assert ステートメントを削除する簡単な方法があります。プリプロセッサ NDEBUG を使用します。GCC コンパイラは、DNDEBUG が定義されているかどうかを判断して、assert() 関数を無効にするかどうかを決定します。
- NDEBUG と構文を使用する場合にアサーションを実装するコードは次のとおりです。
#define assert(_Expression) ((void)0)
上記のコードは、assert() を定義し、_Expression という名前のパラメータを渡して、プログラム内のアサート操作を無効にするための基本的な構文です。
1. 例
意味NDEBUGマクロ時間
#define NDEBUG
# include <assert.h>
int main()
{
int var= 8;
assert (var==1);
system("pause");
return 0;
}
出力:
请按任意键继续. . .
未定義NDEBUGマクロ時間
//#define NDEBUG
# include <assert.h>
int main()
{
int var = 8;
assert(var == 1);
system("pause");
return 0;
}
出力:
Assertion failed: var == 1, file g:\file\vscode\c语言\c语言\c.c, line 6
エラー:
4. 重要なポイント
- アサーションの目的は、プログラマの仮定やその他の操作を使用およびテストすることです。
- 例として、アサートを使用して、malloc() によって返されたポインタが NULL かどうかを判断できます。
- アサーションによれば、プログラムは実行中の特定の期間に特定の要件を満たします。
- 実行すると、assert() は標準エラー出力にエラー メッセージを出力し、式が false の場合はプログラムの実行を中止します。
- プログラマは、プログラムを再コンパイルするだけで、ソース コードを変更せずにアサーションを削除できます。
5. ケース
1. 例 1
例: プログラムでは、2 つの整数を除算します。つまり、a/b (a と b は整数) を計算します。b はゼロにはできません。プログラムでは、assert(b != 0) を使用します。条件 (b != 0) が成立する場合、プログラムの実行は続行されます。それ以外の場合、処理は終了し、ファイル名、行番号、関数名、および成立しない条件を示すエラー メッセージが画面に表示されます。
#include <stdio.h>
#include <assert.h>
int main()
{
int a, b;
printf("Input two integers to divide\n");
scanf("%d%d", &a, &b);
assert(b != 0);
printf("%d/%d = %.2f\n", a, b, a/(float)b);
system("pause");
return 0;
}
1. 次のように入力します。
1 2
1. 出力:
Input two integers to divide
1 2
1/2 = 0.50
请按任意键继续. . .
2. 次のように入力します。
2 0
2. 出力:
Input two integers to divide
2 0
Assertion failed: b != 0, file g:\file\vscode\c语言\c语言\c.c, line 9
2. エラー報告:
2. 例 2
たとえば、プログラムでは整数 i、文字列 arr を入力し、プログラム内でassert(i>= 5) を使用します。
条件 i>= 5 が true の場合、プログラムの実行は続行されます。
条件 i >= 5 が成立しない場合、処理は終了し、ファイル名、行番号、関数名、偽の条件を示すエラー メッセージが画面に表示されます。
arr != NULL という条件が成立する場合、プログラムの実行は続行されます。
条件 arr != NULL が true でない場合、処理は終了し、ファイル名、行番号、関数名、および false 条件を示すエラー メッセージが画面に表示されます。
#include <assert.h>
#include <stdio.h>
int main()
{
int i;
char arr[100];
printf("Please enter an integer value: ");
scanf("%d", &i);
assert(i>= 5);//断言i>=5这个条件
printf("The input integer is: %d\n", i);
printf("Please enter a string: ");
scanf("%s", arr);
assert(arr!= NULL);
printf("The input string is: %s\n", arr);
system("pause");
return(0);
}
1. 次のように入力します。
1
1. 出力:
Please enter an integer value: 1
Assertion failed: i >= 5, file g:\file\vscode\c语言\c语言\c.c, line 10
1. エラー報告:
2. 次のように入力します。
6
qaz
2. 出力:
Please enter an integer value: 6
The input integer is: 6
Please enter a string: qaz
The input string is: qaz
请按任意键继续. . .