ブーリアン型

これはこのページの過去の版です。MetaNest (会話 | 投稿記録) による 2016年6月15日 (水) 02:55個人設定で未設定ならUTC)時点の版であり、現在の版とは大きく異なる場合があります。

ブーリアン型(ブーリアンがた、: Boolean datatype)は、真理値の「真 = true」と「偽 = false」という2値をとる基本データ型である。また、ブーリアンブール型論理型: logical datatype)ともいう。1桁のバイナリ数値データ型(つまり1ビットのデータ型)と見ることもできる。

また、各種ブール演算を行うことができ、論理積 (AND, &, *)、論理和 (OR, |, +)、排他的論理和 (XOR, NEQV, ^)、同値 (EQV, =, ==)、非同値 (NEQV, <>, !=)、否定 (NOT, ~, !)などの操作が可能である。これらの演算はブール代数の演算に対応している。

Ada

Ada では、BooleanStandard パッケージにあり、False および True という値をとる列挙型として定義されている。ここで、False < True である。

type Boolean is (False, True);

p : Boolean := True;
...
if p then
  ...
end if;

比較演算子(=, /=, <, <=, >, >=)は Boolean を含めた全ての列挙型に適用可能である。ブール演算子 andoderxornotBoolean について定義されており、その派生型にも適用可能である。ブール演算子は Boolean の配列にも適用可能である。

ALGOL

Algol 60 にはデータ型として Boolean が定義されており、演算子も定義されている。なお、ALGOL 68 ではデータ型の名称が bool に短縮された。

C言語

C言語の場合、if文の条件式の型といった意味でのブーリアン型は無い(C99_Bool型とシンボルについては後述する)。

ブーリアン型の代わりに数値型を使い、値が0であれば偽・それ以外は真である。またヌルポインタも偽となる。

見やすさのために真と偽の値に名前を付けるには列挙型を使う方法もあるが、

typedef enum _boolean { FALSE, TRUE } boolean;
...
boolean b;

プリプロセッサマクロを使うほうが多い。

#define FALSE 0
#define TRUE 1
...
int f = FALSE;

なお、こういったシンボルを定義した場合、TRUE は代入のためのみに用い、if (cond == TRUE) のように比較してはならない。cond の値が0・1以外の時、C言語としての意味では真であるにもかかわらず、この判定は偽になるので混乱を招くからである。[1]

  • 正しい例: if (cond) {...} あるいは if (!cond) {...}
  • 誤った例: if (cond == TRUE) {...} あるいは if (cond == FALSE) {...}
  • 好ましくない例: if (i < 0 == TRUE) {...} あるいは if (i < 0 == FALSE) {...}

C99

C99ではブーリアン型を格納したりするための型が作られ、その型のためのキーワード _Bool が追加された。さらにその型と値のためにシンボル bool, false, true が、stdbool.h というヘッダファイルで定義される。

#include <stdbool.h>
bool b = false;
...
b = true;

条件式の型などの意味は、C99でも変わっていないので注意すること。

C++

C++では、標準化の過程で booltruefalse というキーワードが導入され、基本データ型としてサポートされた。その大きさは処理系で定義される。

ISO C++ 1998の標準C++ライブラリでは、vector<bool>クラスが定義されている。メモリ使用量を最適化するため、各ブール値は1ビットに格納される。しかし、vector<bool>STLコンテナの要求には合致しないため、これをvectorの特殊化に含めてしまったのは仕様策定上のミスだと言われている(標準化委員会ではstd::vector_boolにするべき等の意見があった)。これは動的なビット集合として使うには非常に適しているが、vector<bool>という名前から連想されるようなSTLのコンテナとしての挙動はしないので、そういう意味では注意が必要である。

ブーリアン型を出力するコードは以下のようになる。

int i = 5;
bool myBool = (i == 5);
std::cout << "i == 5 is " << std::boolalpha << myBool << std::endl;

boolalphaはbool型の値の出力をtrueまたはfalseにするマニピュレータであり、省略すると1または0が出力される。

C#

C#では、ブーリアン型は bool である。

ブーリアン型を出力するコードは以下のようになる:

bool myBool = (i == 5);
System.Console.WriteLine(myBool ? "I = 5" : "I != 5");

FORTRAN

キーワード LOGICAL と演算子 .NOT..AND..OR. などが1950年代に導入された。これはFORTRANが標準化される以前のことである。

Haskell

Haskell では data Bool = False | True のように定義される型であり、Bounded Enum Eq Ord Read Show などの型クラスのインスタンス型である。not・&&・|| といった関数と演算子がある。

Java

Javaでは、ブーリアンはプリミティブ型で boolean である。整数型からbooleanへの、あるいはbooleanからの型変換は無いことをC言語プログラマは留意する必要があるが、コンパイル時にエラーになるので全く問題は無い。

int i = 5;
if (i) System.out.println("i is five");

このようなコードはコンパイル時エラーとなる。ブーリアン型を出力するコードは以下のようになる。

boolean myBool = (i == 5);
System.out.println("i == 5 is " + myBool);

この出力結果は次の通り。

i == 5 is true

boolean のラッパークラスは Boolean である。

LISP

LISP には2つの特殊シンボル T と NIL があり、真理値を表している(T が true、NIL が false)。しかし、LISP処理系では NIL でないあらゆる値が true と解釈される。特殊シンボル NIL は () とも表記され、これは空のリストを意味する。つまり、空のリストは false であるが、何らかの中身のあるリストは true と解釈される。

Scheme

Schemeでは真偽値は #t#f であり、if などでは #f 以外のあらゆる値(特に、空リスト () も)が真として扱われる。

ML

ML には bool 型があり、値として truefalse をとる。以下に例を示す。

- fun isittrue x = if x then "YES" else "NO" ;
> val isittrue = fn : bool -> string
- isittrue true;
> val it = "YES" : string
- isittrue false;
> val it = "NO" : string
- isittrue (8=8);
> val it = "YES" : string
- isittrue (7=5);
> val it = "NO" : string

OCaml

OCamlbool 型を持ち、値として truefalse をとる。

# 1 = 1 ;;
- : bool = true

Pascal

Pascalでは、Boolean は基本データ型として提供されている。以下に例を示す。

var
  value: Boolean;

...

value := True;
value := False;

if value then
begin
...
end;

なお、PascalをベースにしたDelphi言語(Object Pascal)には、Boolean 型の他に ByteBool 型(1バイト論理型)、WordBool 型(2バイト論理型)、LongBool 型(4バイト論理型)が存在する。

Perl

Perlでは、集合型でないデータ型である数や文字列には区別がない(すべてスカラーと呼ばれる)。ブール演算では、要素を持たない集合型、空の文字列、値が 0 と等しい数値、文字列 """0"、未定義変数が "false" と解釈される。これら以外の全ての値は "true" と解釈される(例えば 0.0 とか 0E0 といった文字列は「0 だが true」となる)。

集合型の要素は、存在するかしないかを評価されることもあり[1]、全ての変数は定義されているかいないかを評価されることがある[2]。ハッシュや配列の要素で値が undef であるものは、存在しているが未定義である。存在と定義の区別は、スカラーをブーリアンのように扱う際に重要である。

Perl 5 では真理値を表す定数は組み込まれていないが、Perl 6 では存在している。

Python

Pythonでは、以下のような値が偽として扱われる。他は真として扱われる。

  • 数値型の 0、None、False。
  • 組み込みのコンテナ型の空のオブジェクト。例えば空の文字列、空のリスト、空のタプル。
  • 空の辞書と空の集合。
  • ユーザー定義オブジェクトで、特殊メソッド __nonzero__[2] (Python3の場合__bool__) または __len__ により、自身のブール値に対して制御を持ち、以上のような偽の値を返すもの。

Ruby等に慣れていると最後のようなオブジェクトの扱いを間違えることがあるので注意が必要である。

定数 FalseTrue は Python 2.2.1 でビルトインに追加された。bool 型は Python 2.3 で追加された。

比較演算などは True または False を返す。"or" や "and" は短絡評価によりオペランドの1つを返す。

>>> class spam: pass    # spam にクラスオブジェクトを代入
... 
>>> eggs = "eggs"       # eggs に文字列オブジェクトを代入
>>> spam == eggs        # (等しいかどうかの判定)
False
>>> spam != eggs        # != と == はブール値を返す
True
>>> spam and eggs       # and はオペランドを返す。
'eggs'
>>> spam or eggs        # or もオペランドを返す。
<class __main__.spam at 0x01292660>
>>> 

PHP

PHPbool型はPythonとほぼ同じで、値として TRUEFALSE が定義されており、0やNULLと同じような値は概ね FALSE と見なされる。

  • 数値の0、0.0、NULL
  • FALSE、False、false
  • 空の文字列、文字列の"0"、空の配列
  • 定義されていない変数
  • (PHP4のみ)空のオブジェクト

等はFALSEと見なされる。 また、比較方法によっては厳密な比較を行うこともできる。

$a = 0;
print ( $a == false ); //trueと評価される
print ( $a === false); //falseと評価される

print ( "0" == 0 );    //trueと評価される
print ( 0 == "" );     //trueと評価される
print ( "0" == "" );   //falseと評価される 緩やかな比較では推移律が成り立たない場合がある

Ruby

Rubyにはブーリアン型が無く、falseFalseClassクラスのインスタンス、trueTrueClassクラスのインスタンスである。真偽値としては、falsenil 以外は全て真として扱われるので、空文字列や数値の 0 が偽として扱われる言語に慣れた者や移植の際は注意が必要である。

a = 0
if (a) 
  print "true"
else
  print "false"
end

このコードは "true" を表示する。

nilもオブジェクトであり、NilClassクラスのインスタンスである。

p false.class
p true.class
p nil.class

とした場合、それぞれ "FalseClass"、"TrueClass"、"NilClass" が出力される。

Visual Basic

Visual Basic には Boolean 型があり、比較演算の結果はこの型となる。16ビット(2バイト)の整数として格納されるが、値は True(-1)False(0) しかない。以下に例を示す。

Dim isSmall As Boolean
isSmall = intMyNumber < 10          ' 式を評価した結果は True か False となる
If isSmall Then
   MsgBox("The number is small")
End If

Dim hellFreezesOver As Boolean      ' Boolean 変数は False で初期化される
hellFreezesOver = False             ' あるいは、代入文を使うこともできる
Do Until hellFreezesOver
   Call CheckAndProcessUserInput()
Loop

なお、OLE/COM、とくにOLEオートメーションで使用される論理型 VARIANT_BOOL も、Visual Basic の Boolean 型と同一である。

脚注

  1. ^ そもそも、(条件 == TRUE) という表現は無意味に冗長であり、単に (条件) と書くべきである。もし、(条件 == TRUE) と書くことが何かを明示していて良い表現だというのなら、...(((条件 == TRUE) == TRUE) == TRUE) == TRUE... は、もっと良い表現だということになる( http://www.kouno.jp/home/c_faq/c9.html#2亀がアキレスに言ったこと)。
  2. ^ Special method names: Basic customization”. Python Language Reference. 2008年2月3日閲覧。