作曲・指導・C言語・Linux

金沢音楽制作

金沢音楽制作では、楽曲・楽譜の制作と、作曲や写譜などレッスンを行っています。

待望の_Bool型

C99で、真偽値を扱う_Bool型が追加されました。stdbool.hをインクルードすると、さらに、つぎの4つのマクロが定義されます。

『Cクイックリファレンス』297頁

stdbool.h
マクロ定義 トークン
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

すでにあるコードで、#defineenumなどで、TRUEFALSEが定義されている場合は、戻り値の型をintから_Boolに変更するだけでいいと思います。自作のboolは、01のどちらが真偽なのか、人によってまちまちです。

#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型にキャストすることができます。値が0NULLなら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型にキャストすれば、確実に01を返せます。

更新情報