ブーリアン型
ブーリアン型(ブーリアンがた、英: Boolean datatype)は、真理値の「真 = true」と「偽 = false」という2値をとる基本データ型である。また、ブーリアン、ブール型、論理型(英: logical datatype)ともいう。1桁のバイナリ数値データ型(つまり1ビットのデータ型)と見ることもできる。
if文の条件式の値は、このデータ型として使われることが多い。また、各種ブール演算を行うことができ、論理積 (AND, &, *)、論理和 (OR, |, +)、排他的論理和 (XOR, NEQV, ^)、同値 (EQV, =, ==)、非同値 (NEQV, <>, !=)、否定 (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言語 [編集]
C89 [編集]
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 [編集]
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コンテナの要求には合致しないため、これを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 型で表され、そのサイズは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;
なお、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には bool型があり、値として True と False も定義されている。また、全てのオブジェクトをブール演算で評価可能である。以下の値は False と見なされる:
- 数値型の 0、None、False。
- 組み込みのコンテナ型の空のオブジェクト。例えば空の文字列、空のリスト、空のタプル。
- 空の辞書と集合。
- ユーザー定義オブジェクトで、特殊メソッド __nonzero__[1] (Python3の場合__bool__) または __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> >>>
PHP [編集]
PHPの bool型はPythonとほぼ同じで、値として TRUE と FALSE が定義されており、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には言語機能としてブーリアン型が存在しない。ただし、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ビット(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 型と同一である。
N88-BASIC(86) [編集]
N88-BASIC(86) には Boolean 型は無いが、16ビットの整数が代用され、真なら-1、偽なら0 となっている。
A%=1 IF A% THEN PRINT "TRUE" ELSE PRINT "FALSE" 'TRUE と表示される B%=100 IF B% THEN PRINT "TRUE" ELSE PRINT "FALSE" 'TRUE と表示される IF A%=3 THEN PRINT "TRUE" ELSE PRINT "FALSE" 'FALSE と表示される C%=A%=3 'A% と 3 を比較し、その結果を C% に代入する意。 PRINT C% '0 と表示される D%=A%=1 'A% と 1 を比較し、その結果を D% に代入する意。 PRINT D% '-1 と表示される
脚注 [編集]
- ^ “Special method names: Basic customization”. Python Language Reference. 2008年2月3日閲覧。