ブーリアン型
出典: フリー百科事典『ウィキペディア(Wikipedia)』
ブーリアン型(英: Boolean datatype)とは、真理値の「真 = true」と「偽 = false」という2値をとる基本データ型である。また、ブーリアン、ブール型、論理型(英: Logical datatype)とも。1桁のバイナリ数値データ型(つまり1ビットのデータ型)と見ることもできる。
if文の条件式の値は、このデータ型として使われることが多い。また、各種ブール演算を行うことができ、論理積 (AND
, &
, *
)、論理和 (OR
, |
, +
)、排他的論理和 (xor
, NEQV
, ^
)、同値 (EQV
, =
, ==
)、否定 (NOT
, ~
, !
)などの操作が可能である。これらの演算はブール代数の演算に対応している。
目次 |
[編集] Ada
Ada では、Boolean
は Standard パッケージにあり、False
および True
という値をとる列挙型として定義されている。ここで、False
< True
である。
type Boolean is (False, True); p : Boolean := True; ... if p then ... end if;
比較演算子(=
, /=
, <
, <=
, >
, >=
)は Boolean
を含めた全ての列挙型に適用可能である。ブール演算子 and
、or
、xor
、not
が Boolean
について定義されており、その派生型にも適用可能である。ブール演算子は Boolean
の配列にも適用可能である。
[編集] ALGOL
Algol 60 にはデータ型として Boolean
が定義されており、演算子も定義されている。なお、ALGOL 68 ではデータ型の名称が bool
に短縮された。
[編集] C言語
C言語では、C89 にはブーリアン型が定義されていない(C99には定義されている)。ブーリアン型がない代わりに true/false は 0 かどうかで判断される。次のようなコードがあったとする。
if (my_variable) { printf("True!\n"); } else { printf("False!\n"); }
これは実際には次のコードと全く同じである。
if (my_variable != 0) { printf("True!\n"); } else { printf("False!\n"); }
つまりこれは単なる整数型にすぎない。浮動小数点数は 0 との比較がうまくいかない可能性があるため、整数型でブーリアン型を表すのが一般的である。
真偽の判定のためにブーリアンの値に true や false といった名前をつける必要性はないが、値を代入するにあたっては値の名称が必要となる。処理系に依存しない方法としては、0 と 1 を使う方法がある。代替案としては、enum
キーワードで要素に名前をつける方法もある。
typedef enum _boolean { FALSE, TRUE } boolean; ... boolean b;
しかし、実際には enum
を使うことは滅多にない。代わりにプリプロセッサのマクロで 0 と 1 の別名を定義するのが一般的である。
#define FALSE 0 #define TRUE 1 ... int f = FALSE;
C99準拠の最近の処理系では、_Bool
型があり、これを使ってstdbool.h
というヘッダファイルで bool
型が定義されている。これによってC++との互換性が得られる。
#include <stdbool.h> bool b = false; ... b = true;
[編集] C++
C++では、標準化の過程で bool
、true
、false
というキーワードが導入され、基本データ型としてサポートされた。その大きさは処理系で定義される。
ISO C++ 1998の標準C++ライブラリでは、vector<bool>
クラスが定義されている。メモリ使用量を最適化するため、各ブール値は1ビットに格納される。しかし、これは仕様策定上の間違いだと言われている。vector<bool>
はSTLコンテナの要求には合致せず、C++標準化委員会とライブラリ作業グループはこれを次のバージョンで削除するか、使わないよう周知させるべきとの点で見解が一致している。
ブーリアン型を出力するコードは以下のようになる。
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
型で表され、そのサイズは1バイトである。
ブーリアン型を出力するコードは以下のようになる:
bool myBool = (i == 5); System.Console.WriteLine(myBool ? "I = 5" : "I != 5");
[編集] FORTRAN
キーワード LOGICAL
と演算子 .NOT.
、.AND.
、.OR.
などが1950年代に導入された。これはFORTRANが標準化される以前のことである。
[編集] Java
Javaでは、ブーリアン型は boolean
型で表され、一般に1バイトで実装される(実装はJava仮想マシンに依存する)。boolean
への、あるいはboolean
からの型変換は許されない。
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
[編集] OCaml
OCamlは bool
型を持ち、値として true
と false
をとる。
# 1 = 1 ;; - : bool = true
他の列挙型と同様、この型も値の格納場所として1ワードを使用する。
[編集] LISP
LISP には2つの特殊シンボル T と NIL があり、真理値を表している(T が true、NIL が false)。しかし、LISP処理系では NIL でないあらゆる値が true と解釈される。特殊シンボル NIL は () とも表記され、これは空のリストを意味する。つまり、空のリストは false であるが、何らかの中身のあるリストは true と解釈される。
[編集] ML
OCaml と同様 ML には bool
型があり、値として true
と false
をとる。以下に例を示す。
- 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
[編集] Pascal
Pascalでは、Boolean
は基本データ型として提供されている。以下に例を示す。
var value: Boolean; ... value := True; value := False; if value then begin ... end;
[編集] Perl
Perlでは、集合型でないデータ型である数や文字列には区別がない(すべてスカラーと呼ばれる)。ブール演算では、要素を持たない集合型、空の文字列、値が 0 と等しい数値、文字列 ""
と "0"
、未定義変数が "false" と解釈される。これら以外の全ての値は "true" と解釈される(例えば 0.0
とか 0E0
といった文字列は「0 だが true」となる)。
集合型の要素は、存在するかしないかを評価されることもあり[1]、全ての変数は定義されているかいないかを評価されることがある[2]。ハッシュや配列の要素で値が undef
であるものは、存在しているが未定義である。存在と定義の区別は、スカラーをブーリアンのように扱う際に重要である。
Perl 5 では真理値を表す定数は組み込まれていないが、Perl 6 では存在している。
[編集] Python
Pythonには bool
型があり、値として True
と False
も定義されている。また、全てのオブジェクトをブール演算で評価可能である。以下の値は False と見なされる:
- 数値型の 0、None、False。
- 組み込みのコンテナ型の空のオブジェクト。例えば空の文字列、空のリスト、空のタプル。
- 空の辞書と集合。
- ユーザー定義オブジェクトで、特殊メソッド __nonzero__[1] または __len__ により、自身のブール値に対して制御を持つもの。
これら以外のオブジェクトは全て True と評価される。
ブール演算子や組み込みのブーリアン型は 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> >>>
[編集] Ruby
Rubyには言語機能としてブーリアン型が存在しない。ただし、true
、false
、nil
という特殊な定数が存在する(それぞれ専用のクラスの特異インスタンス)。そしてブール演算では、false
と nil
以外は全て true
と評価される。例えば、空の文字列も数値の 0 も他の言語とは異なり、true
と評価されるので、注意が必要である。nil
は初期化されていないインスタンスやグローバル変数の値として使用される。true
、false
、nil
は、変数への代入、関数やメソッドのリターン値、ブール式との比較対象として使用可能である。
a = 0 if (a) print "true" else print "false" end
このコードは "true" を表示する。
Ruby は純粋なオブジェクト指向プログラミング言語なので、true、false、nil もオブジェクトであり、クラスに属している。
p false.class p true.class p nil.class
とした場合、それぞれ "FalseClass"、"TrueClass"、"NilClass" が出力される。
[編集] Visual Basic
Visual Basic には Boolean
型があり、比較演算の結果はこの型となる。16ビットの整数として格納されるが、値は True(-1)
と False(0)
しかない。以下に例を示す。
Dim isSmall As Boolean isSmall = intMyNumber < 10 ' 式を評価した結果は True か False となる If isSmall Then MsgBox("The number is small") Endif
Dim hellFreezesOver As Boolean ' Boolean 変数は False で初期化される hellFreezesOver = False ' あるいは、代入文を使うこともできる Do Until hellFreezesOver Call CheckAndProcessUserInput() Loop
[編集] 注
- ^ "Special method names: Basic customization" Python Language Reference.