日々の記録。

プログラミングのメモや感じた事などを記録。

C++講座 その2 論理型 bool型

論理型(bool, boolean型)はtrue(真)かfalse(偽)を表現する。

例えばC言語では、

if ( 3 ) {
  /* 必ずこっちの処理が行われる */
} else {
  /* */
}

のように、0以外が真で0が偽となっていた。if文の結果が真の場合、if文ブロックの処理が行われ、偽の場合elseのブロックが処理される。

C++では、真偽値を明示するためにbool型が追加されている。

if ( true ) {
  /* 必ずこっちの処理が行われる */
} else {
  /* */
}

例えば無限ループも次のように表現できる。

/* Cの場合 */
while(1) {
}
// C++の場合
while(true) {
}

といっても、C++はCと互換性があるので、最初のif(3)という書き方もそのまま使える。但し、可読性を考えるなら積極的にtrue, falseを利用するべき。

C言語とWindowsでのBOOL型 そしてその注意事項

ちなみにC言語でも真偽値を明示するために、

typedef enum tagBoolean{FALSE, TRUE}Bool;

とすると、Bool型を定義できる。

Visual C++などを利用している場合、BOOL型という型をみかけることがある。 これは記憶が正しければ

typedef UINT BOOL;
#define FALSE  (0)
#define TRUE  (1)

の様に定義されている。Windows APIC言語での利用も前提としているため、(恐らく)C++型のbool型ではなく、独自定義のBOOL型を利用している。

注意点としては、BOOL型はUINTの別名でしかないため、例えば次の様な書き方ができてしまう。

BOOL foo() {
  return 3;
}

void bar() {
  if( foo() == TRUE ) {
    /* この処理は通らない */
  }
}

このため、BOOL型を比較する場合はFALSEで比較するか、TRUE / FALSEを明示しないこと。

void bar() {
  if( foo() != FALSE ) {
    /* こっちを通る */
  }
}

void bar() {
  if( foo() ) {
    /* こっちを通る */
  }
}

bool型の値

bool型をintに代入すると次のように変換される。

int a = true; => 1
int b = false; => 0

int c = 3;
bool d = (bool)c; => true
int e = (int)d; => 1;

JavaC#でのbool,boolean

JavaC#ではifやwhileなどの式の結果は論理型と規定されている。

if( 3 ) { // コンパイルエラー
}

if( true ) { // OK
}

と、論理型を指定する必要がある。

C言語C++では、

3 == 1; => 0
3 == 3; => 1

と比較演算の結果が0, 1で返っていたのに対して、Java/C#では

3==1; => false
3==3; => true

と比較演算の結果は、論理型で返される。