待望の_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を返せます。