サーチ…


備考

定義済みの_Boolタイプとヘッダ<stdbool.h>を使用するには、CのC99 / C11バージョンを使用している必要があります。

コンパイラの警告やエラーを避けるため、C89以前のバージョンの言語を使用している場合にのみ、 typedef / define例を使用してください。

stdbool.hの使用

C99

システムヘッダーファイルstdbool.h使用すると、 boolをブール型データ型として使用できます。 true1評価され、 false0評価され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として、整数値0falseとして効果的に扱いfalse 。 C99のように_Boolboolを使用できない場合は、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

C99

C標準バージョンC99に加えて、 _BoolもネイティブCデータ型です。値0falseの場合 )と1trueの場合 )を保持することができます。

#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ならz0なりX == 0 。それ以外の場合、 z1なります。
  • Xがポインタ型の場合、 Xがヌルポインタの場合はz0なり、それ以外の場合は1ます。

boolfalse 、および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評価され、値のいずれかにつながる012または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を参照列挙型を



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow