C Language
ブール
サーチ…
備考
定義済みの_Bool
タイプとヘッダ<stdbool.h>
を使用するには、CのC99 / C11バージョンを使用している必要があります。
コンパイラの警告やエラーを避けるため、C89以前のバージョンの言語を使用している場合にのみ、 typedef
/ define
例を使用してください。
stdbool.hの使用
システムヘッダーファイルstdbool.h
使用すると、 bool
をブール型データ型として使用できます。 true
は1
評価され、 false
は0
評価され0
。
#include <stdio.h>
#include <stdbool.h>
int main(void) {
bool x = true; /* equivalent to bool x = 1; */
bool y = false; /* equivalent to bool y = 0; */
if (x) /* Functionally equivalent to if (x != 0) or if (x != false) */
{
puts("This will print!");
}
if (!y) /* Functionally equivalent to if (y == 0) or if (y == false) */
{
puts("This will also print!");
}
}
bool
は、データ型_Bool
単なる素晴らしいスペルです。数字やポインタを変換するときには特別な規則があります。
#defineを使う
すべてのバージョンのCは、 0
以外の任意の整数値を比較演算子に対してtrue
として、整数値0
をfalse
として効果的に扱いfalse
。 C99のように_Bool
やbool
を使用できない場合は、Cで#define
マクロを使用してブールデータ型をシミュレートすることができますが、レガシーコードでもそのようなものを見つけることができます。
#include <stdio.h>
#define bool int
#define true 1
#define false 0
int main(void) {
bool x = true; /* Equivalent to int x = 1; */
bool y = false; /* Equivalent to int y = 0; */
if (x) /* Functionally equivalent to if (x != 0) or if (x != false) */
{
puts("This will print!");
}
if (!y) /* Functionally equivalent to if (y == 0) or if (y == false) */
{
puts("This will also print!");
}
}
これらのマクロの定義が現代的な<stdbool.h>
使用法と衝突する可能性があるので、これを新しいコードに導入しないでください。
組み込み(組み込み)型の使用_Bool
C標準バージョンC99に加えて、 _Bool
もネイティブCデータ型です。値0
( falseの場合 )と1
( trueの場合 )を保持することができます。
#include <stdio.h>
int main(void) {
_Bool x = 1;
_Bool y = 0;
if(x) /* Equivalent to if (x == 1) */
{
puts("This will print!");
}
if (!y) /* Equivalent to if (y == 0) */
{
puts("This will also print!");
}
}
_Bool
は整数型ですが、他の型からの変換には特別な規則があります。結果はif
式の他の型の使用に似ています。以下では
_Bool z = X;
-
X
が算術型(任意の種類の数)である場合、X == 0
ならz
は0
なりX == 0
。それ以外の場合、z
は1
なります。 -
X
がポインタ型の場合、X
がヌルポインタの場合はz
は0
なり、それ以外の場合は1
ます。
bool
、 false
、およびtrue
より良いスペルを使用するには、 <stdbool.h>
を使用する必要があります。
ブール式の整数とポインタ。
すべての整数またはポインタは、「真理値」として解釈される式で使用できます。
int main(int argc, char* argv[]) {
if (argc % 4) {
puts("arguments number is not divisible by 4");
} else {
puts("argument number is divisible by 4");
}
...
式argc % 4
評価され、値のいずれかにつながる0
、 1
、 2
または3
。最初の0
は「偽」でelse
要素に実行をもたらす唯一の値else
。他のすべての値は "true"で、 if
部分に入ります。
double* A = malloc(n*sizeof *A);
if (!A) {
perror("allocation problems");
exit(EXIT_FAILURE);
}
ここでポインタA
が評価され、ポインタがヌルポインタであればエラーが検出され、プログラムは終了する。
多くの人は、 A == NULL
ようなものを書くことを好みますが、他の複雑な式の中でこのようなポインタの比較があると、読みにくくなります。
char const* s = ....; /* some pointer that we receive */
if (s != NULL && s[0] != '\0' && isalpha(s[0])) {
printf("this starts well, %c is alphabetic\n", s[0]);
}
これを確認するには、式の中の複雑なコードをスキャンし、オペレータの好みを確認する必要があります。
char const* s = ....; /* some pointer that we receive */
if (s && s[0] && isalpha(s[0])) {
printf("this starts well, %c is alphabetic\n", s[0]);
}
キャプチャするのが比較的簡単です:ポインタが有効な場合、最初の文字がゼロでないかどうかを確認し、それが文字かどうかを確認します。
typedefを使ってbool型を定義する
ほとんどのデバッガは#define
マクロを認識していないが、 enum
定数をチェックすることができるので、次のようなことが望ましいかもしれません。
#if __STDC_VERSION__ < 199900L
typedef enum { false, true } bool;
/* Modern C code might expect these to be macros. */
# ifndef bool
# define bool bool
# endif
# ifndef true
# define true true
# endif
# ifndef false
# define false false
# endif
#else
# include <stdbool.h>
#endif
/* Somewhere later in the code ... */
bool b = true;
これにより、Cの履歴バージョンのコンパイラは機能することができますが、コードが現代のCコンパイラでコンパイルされている場合は、前方互換性を保ちます。
詳細についてはtypedef
、参照typedefのをよりにするために、 enum
を参照列挙型を