待望の_Bool型
C99で、真偽値を扱う_Bool
型が追加されました。stdbool.h
をインクルードすると、さらに、つぎの4つのマクロが定義されます。
『Cクイックリファレンス』297頁
マクロ定義 | トークン |
---|---|
bool |
_Bool |
true |
1 |
false |
0 |
__bool_true_false_are_defined |
1 |
入力された値が素数かどうかを判断するプログラムを書きました。isPrimeNumber()
関数は、与えられた整数が素数ならtrue
を、合成数ならfalse
を返します。
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <math.h>
static bool isPrimeNumber(int n);
int main(int argc, char *argv[])
{
int n = atoi(argv[1]);
if (isPrimeNumber(n)) {
printf("%d is prime number\n", n);
}
return 0;
}
static bool isPrimeNumber(int n)
{
if (n < 2) {
return false;
}
for (int i = 2; i <= sqrt(n); i++) {
if (n % i == 0) {
return false;
}
}
return true;
}
$ for i in {-3..10}; do ./a.out $i; done
2 is prime number
3 is prime number
5 is prime number
7 is prime number
すでにあるコードで、#define
やenum
などで、TRUE
/FALSE
が定義されている場合は、戻り値の型をint
から_Bool
に変更するだけでいいと思います。自作のbool
は、0
と1
のどちらが真偽なのか、人によってまちまちです。
#ifndef TRUE
#define TRUE (0==0)
#define FALSE (!TRUE)
#endif
/*
typedef enum {
TRUE,
FALSE,
} bool;
*/
static _Bool isPrimeNumber(int n)
{
if (n < 2) {
return FALSE;
}
for (int i = 2; i <= n/2; i++) {
if (n % i == 0) {
return FALSE;
}
}
return TRUE;
}
_Bool
型にキャストすることができます。値が0
かNULL
なら0
、それ以外なら1
に変換されます。
『Cクイックリファレンス』49頁
#include <stdio.h>
int main(void)
{
int x = 0;
char c = 'A';
char t = '\t';
char *s = NULL;
printf("%d is %d\n", x, (_Bool)x);
printf("%c is %d\n", c, (_Bool)c);
printf("%c is %d\n", t, (_Bool)t);
printf("NULL is %d\n", (_Bool)s;
return 0;
}
$ ./a.out
x is 0
A is 1
is 1
NULL is 0
_Bool
型にキャストすれば、確実に0
か1
を返せます。