ブーリアン型

ブーリアン型（ブーリアンがた、）は、真理値の「真 = true」と「偽 = false」という2値をとるデータ型である。ブーリアン、ブール型、論理型（logical datatype）などともいう。2種類の値を持つ列挙型とも、2進で1ケタすなわち1ビットの整数型とも、見ることもできる。
また、各種ブール演算を行うことができ、論理積 (codice_1、codice_2、codice_3)、論理和 (codice_4、codice_5、codice_6)、排他的論理和 (codice_7、codice_8、codice_9)、同値 (codice_10、codice_11、codice_12)、非同値 (codice_8、codice_14、codice_15)、否定 (codice_16、codice_17、codice_18) などの操作が可能である。これらの演算はブール代数の演算に対応している。
Ada.
Ada では、codice_19 は codice_20 パッケージにあり、codice_21 および codice_22 という値をとる列挙型として定義されている。ここで、codice_21 < codice_22 である。
type Boolean is (False, True);
p : Boolean := True;
if p then
end if;
比較演算子（codice_11、codice_26、codice_27、codice_28、codice_29、codice_30）は codice_19 を含めた全ての列挙型に適用可能である。ブール演算子 codice_32、codice_33、codice_34、codice_35 が codice_19 について定義されており、その派生型にも適用可能である。ブール演算子は codice_19 の配列にも適用可能である。
ALGOL.
Algol 60 にはデータ型として codice_19 が定義されており、演算子も定義されている。なお、ALGOL 68 ではデータ型の名称が codice_39 に短縮された。
C言語.
C89の規格の範囲内では、ブーリアン型は存在せず、伝統的にで代用される（C99の codice_40型とシンボルについては後述する）。標準の観点からは移植性・相互運用性は著しく悪化するが、集成体のサイズ削減などの観点から、型サイズが常に1バイトのcodice_41で代用されることもある（JNIヘッダー<jni.h>のcodice_42型、COMヘルパー<rpcndr.h>のcodice_43型など）。
通例、値が 0 であれば偽であり、それ以外は真である。ただし論理否定演算子codice_18による codice_45 のような式は、真の値の代表値として 1 を返すと標準規格で決められている。他に、ヌルポインタや浮動小数点数 0.0 のような、定数 0 と同様の値が偽として扱われる。
真と偽の値に名前を付けて意味を明確にする際に、列挙型を使う方法もあるが、実際はプリプロセッサマクロが使われていることのほうが多い（Windows APIなど）。
typedef enum boolean { FALSE, TRUE } boolean_t;
boolean_t b = TRUE;
typedef int boolean_t;
boolean_t f = FALSE;
列挙型のほうが、型とその型の変数に代入してよい定数との対応が分かりやすい。デバッガの実装および利用時に関しても、マクロシンボルよりも列挙型のほうが有利である。また、プリプロセッサマクロは名前衝突時に予期せぬ動作を引き起こすこともある。いずれにしても、C99では標準で定義されたものがあるし、そうでなくても大抵の環境では処理系標準ライブラリなどのヘッダーファイル内で同様のシンボルが定義されていることが多いため、プログラマがユーザーコードで明示的に定義する必要はほとんどない。
なお、こういったシンボルを定義した場合、codice_46 は代入のためのみに用い、codice_47 のように比較に使用してはならない。codice_48 の値が0でもなく1でもないとき、C言語としての意味では真であるにもかかわらず、codice_46との比較判定式は偽になることで混乱や不具合を招くからである。
そもそも、(条件 == TRUE) という表現は無意味に冗長であり、単に (条件) と書くべきである。もし、(条件 == TRUE) と書くことが何かを明示していて良い表現だというのなら、...(((条件 == TRUE) == TRUE) == TRUE) == TRUE... は、もっと良い表現だということになる（次を参照のこと http://www.kouno.jp/home/c_faq/c9.html#2 、亀がアキレスに言ったこと）。
C99.
C99ではブーリアン型を格納したりするための型が作られ、その型のためのキーワード codice_40 が追加された。さらにその型と値のためにシンボル codice_39, codice_62, codice_63 が、<stdbool.h> というヘッダファイルで定義される。C99規格では、codice_39をtypedefではなくマクロで実装することを規定している。
bool b = false;
b = true;
条件式の型などの意味は、C99でも変わっていないので注意すること。
ステータスコードと真偽値.
0が偽、0以外が真というルールは、C言語文化圏で必ずしもいつもそうとは限らず、ライブラリやフレームワークによっては別のルールの場合もある。C言語文化圏で最も顕著な例はUnix等における終了ステータスの慣習であろう。正常を示す0が真、異常を示す0以外の残り全てが偽（エラーコード）という扱いであり、シェルのコマンド行中の codice_65 や codice_66 は終了ステータスの値をそのように扱って短絡評価の動作をする。これは、異常については「何が起きたのか」といったような情報が必要なことが多いため、といったような理由がある。
COMのステータスコードとして使われる32ビット整数のcodice_67型は、ゼロを成功（codice_68）、正数を準成功（codice_69: 失敗ではないが否定的な状態）、負数を失敗（codice_70など）、とみなす。成否の判定のためにcodice_71/codice_72マクロが用意されている。
C11で標準化されたcodice_73型はゼロを正常（エラーなし）とみなす。
また、比較などで「小なり」「等しい」「大なり」の3通りの意味を返したい、といった場合には、負の値・ゼロ・正の値、とするのが自然であるため、たとえば代表例の strcmp() 関数では、文字列が等しいということを示すためにゼロが返される。なお、単に「文字列が等しいか？」という比較をする場合などに、以下のように論理否定演算子codice_18を使用したコードは一見不自然に見えるため、あえてcodice_75と記述することで分かりやすさを向上する方法もある。
/* 論理否定演算子により、一見して「文字列が等しくない場合」であるかのように見えるが、実際は「文字列が等しい場合」を意味する。 */
if ( ! strcmp(cmd, "hello")) {
 say_hello();
} else if ( ! strcmp(cmd, "hi")) {
 say_hi();
} else if ( ! strcmp(cmd, "bye")) {
 exit(0);
C++.
C++では、標準化の過程で codice_39、codice_63、codice_62 というキーワードが導入され、基本データ型としてサポートされた。その大きさは処理系で定義される。
ブーリアン型を出力するコードは以下のようになる。
int i = 5;
bool myBool = (i == 5);
std::cout « "i == 5 is " « std::boolalpha « myBool « std::endl;
boolalphaはbool型の値の出力をtrueまたはfalseにするマニピュレータであり、省略すると1または0が出力される。
vector<bool>.
ISO C++ 1998の標準C++ライブラリでは、codice_79クラスが定義されている。メモリ使用量を最適化するため、各ブール値は1ビットに格納される。しかし、codice_79はSTLコンテナの要求には合致しないため、これをvectorの特殊化に含めてしまったのは仕様策定上のミスだと言われている（標準化委員会ではcodice_81にするべき等の意見があった）。これは動的なビット集合として使うには非常に適しているが、codice_79という名前から連想されるようなSTLのコンテナとしての挙動はしないので、そういう意味では注意が必要である。
C#.
C#では、ブーリアン型は codice_39 である。これは.NETのcodice_84型のエイリアスであるが、codice_85とcodice_86演算子の結果はそれぞれ異なる。
Console.WriteLine(typeof(bool)); // System.Boolean
Console.WriteLine(System.Runtime.InteropServices.Marshal.SizeOf(typeof(bool))); // 4
Console.WriteLine(sizeof(bool)); // 1
bool b = true;
Console.WriteLine(Convert.ToInt32(b)); // 1
ブーリアン型を出力するコードは以下のようになる。
int i = 5;
bool myBool = (i == 5);
System.Console.WriteLine("i == 5 is " + myBool);
この出力結果は次の通り。
 i == 5 is True
Dart.
Dartでは、dart:core ライブラリに bool クラスがあり、true と false がそれの真偽値（とそのリテラル）である。（「他の多くの値は真として扱われる」という、他の多くの言語と違い）true 以外は全て偽として扱われる。さらに checked mode では、if文など真偽値が必要とされる場所では型チェックがされるため、他の型の値であった場合は型チェックでエラーになる。
FORTRAN.
キーワード codice_87 と演算子 codice_88、codice_89、codice_90 などが1950年代に導入された。これはFORTRANが標準化される以前のことである。
Haskell.
Haskell では data Bool = False | True のように定義される型であり、Bounded Enum Eq Ord Read Show などの型クラスのインスタンス型である。not・&&・|| といった関数と演算子がある。
Java.
Javaでは、ブーリアンはプリミティブ型で codice_43 である。整数型からcodice_43への、あるいはcodice_43から整数型への暗黙の型変換は無い。
以下のようなコードはコンパイル時エラーとなる。
int i = 5;
if (i = 5) System.out.println("i is five"); // i == 5 の間違い。
if (i) System.out.println("i is not zero");
上記の例において、式 codice_94 や codice_95 の結果はcodice_96と評価されるが、Javaのif文の条件式はC/C++と違いcodice_43のみを受け付けるためコンパイルエラーとなる。
ブーリアン型を出力するコードは以下のようになる。
boolean myBool = (i == 5);
System.out.println("i == 5 is " + myBool);
この出力結果は次の通り。
 i == 5 is true
codice_43 のプリミティブラッパークラスは codice_19 である。
JavaScript.
JavaScriptにはBoolean型があり、それの真偽値（とそのリテラル）は true と false である。比較演算などの結果はBooleanの値になるが、論理演算子 && や || は引数を次で示すように扱って短絡評価し、結果はどちらかの引数の値となる。JavaScriptでは論理演算子やif文など真偽を必要とする場合に、それが真として扱われること（真となる値）を truthy（真値っぽい）、偽として扱われること（偽となる値）を falsy（偽値っぽい）と言う。代表値 false の他、Undefined型の値、Null型の値、数値の 0 と −0 と NaN、空文字列（ " ）、0n（BigIntの0）、以上の値が falsy であり、代表値 true の他、以上で述べた falsy である値以外の全ての値が truthy である。
なお標準仕様であるECMAScriptの規格票ではそのような用語を使わず、真偽値を評価する場所では §7.1.2（ECMA-262 7th Edition の場合）で示されている ToBoolean という操作を使って true か false かを得るといったように記述されている。
Scheme.
Schemeでは真偽値は codice_100 と codice_101 であり、if などでは codice_101 以外のあらゆる値（特に、空リスト codice_103 も）が真として扱われる。
ML.
ML には codice_39 型があり、値として codice_63 と codice_62 をとる。以下に例を示す。
- 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.
OCamlも codice_39 型を持ち、値として codice_63 と codice_62 をとる。
- : bool = true
Pascal.
Pascalでは、codice_19 は基本データ型として提供されている。以下に例を示す。
var
 value: Boolean;
value := True;
value := False;
if value then
begin
end;
なお、PascalをベースにしたDelphi言語（Object Pascal）には、codice_19 型の他に codice_112 型（1バイト論理型）、codice_113 型（2バイト論理型）、codice_114 型（4バイト論理型）が存在する。
Perl.
Perlでは、集合型でないデータ型である数や文字列には区別がない（すべてスカラーと呼ばれる）。ブール演算では、要素を持たない集合型、空の文字列、値が 0 と等しい数値、文字列 codice_115 と codice_116、未定義変数が "false" と解釈される。これら以外の全ての値は "true" と解釈される（例えば codice_117 とか codice_118 といった文字列は「0 だが true」となる）。
集合型の要素は、存在するかしないかを評価されることもあり、全ての変数は定義されているかいないかを評価されることがある。ハッシュや配列の要素で値が codice_119 であるものは、存在しているが未定義である。存在と定義の区別は、スカラーをブーリアンのように扱う際に重要である。
Perl 5 では真理値を表す定数は組み込まれていないが、Raku (Perl 6) では存在している。
Python.
Pythonでは、以下のような値が偽として扱われる。他は真として扱われる。
Ruby等に慣れていると最後のようなオブジェクトの扱いを間違えることがあるので注意が必要である。
定数 codice_21 と codice_22 は 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.
PHPの codice_39型はPythonとほぼ同じで、値として codice_46 と codice_124 が定義されており、0やNULLと同じような値は概ね FALSE と見なされる。
等はFALSEと見なされる。
また、比較方法によっては厳密な比較を行うこともできる。
$a = 0;
print ( $a == false ); // trueと評価される。
print ( $a === false ); // falseと評価される。
print ( "0" == 0 ); // trueと評価される。
print ( 0 == "" ); // trueと評価される。
print ( "0" == "" ); // falseと評価される。緩やかな比較では推移律が成り立たない場合がある。
Ruby.
Rubyにはブーリアン型に相当するようなクラスは無く、codice_62 は codice_126クラスのインスタンス、codice_63 は codice_128クラスのインスタンスである。真偽値としては、codice_62 と codice_130 以外は全て真として扱われるので、空文字列や数値の 0 が偽として扱われる言語に慣れた者や移植の際は注意が必要である。
a = 0
if (a) 
 print "true"
else
 print "false"
end 
このコードは "true" を表示する。
codice_130もオブジェクトであり、codice_132クラスのインスタンスである。
p false.class
p true.class
p nil.class
とした場合、それぞれ "FalseClass"、"TrueClass"、"NilClass" が出力される。
Smalltalk.
Smalltalkではcodice_63はcodice_22クラスのオブジェクト、codice_62はcodice_21クラスのオブジェクトで、codice_22クラスとcodice_21クラスはそれぞれcodice_19クラスを継承したクラスになっている。Smalltalkには言語機能としてif文にあたる構文が無くcodice_22クラスとcodice_21クラスの違いによって分岐を実現している。
value := true ifTrue: [ 1 ] ifFalse: [ 0 ].
上記はif文にあたる分岐の例でcodice_63に分岐用のメッセージを送っているため前者のブロックを評価しvalueに1を代入している。
メッセージ送信側だけでは他の言語におけるif文の糖衣構文にしか見えないが書き方はSmalltalkにおける一般的なメッセージ式に過ぎず、クラスにも下記のようにメッセージに対応するメソッドが存在する。
True methodsFor: 'basic'
ifTrue: aTrueBlock
ifFalse: aFalseBlock
 ^ aTrueBlock value.
Smalltalkにおけるブール値はこのような構造になっているため、原則として他の言語の様に数値との相互変換が存在しない。ただし、codice_143を実装したオブジェクトとの互換性を持つ。ただし処理系によっては性能維持のためcodice_143の引数にブロック指定した場合はtrueかfalseでなければ例外を出すなど互換性が若干制限されている場合もある。
また、Smalltalkではcodice_130も同様に分岐として振る舞うことができ、codice_130と組み合わせることで3値論理として使うこともできる。
nil ifNotNil: [ :value | value ifTrue: [] ifFalse: [] ].
Visual Basic.
Visual Basic には codice_19 型があり、比較演算の結果はこの型となる。16ビット（2バイト）の整数として格納されるが、値は codice_148 と codice_149 しかない。以下に例を示す。
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オートメーションで使用される論理型 codice_150 も、Visual Basic の codice_19 型と同一である。codice_152およびcodice_153は<wtypes.h>にて以下のように定義されている。
typedef short VARIANT_BOOL;
VB.NET.
Visual Basic .NET (VB.NET) のcodice_19型はcodice_84のエイリアスであるが、組み込みの関数や互換メソッドを使う場合はオリジナルのVBと類似の振る舞いをする。
Console.WriteLine(GetType(Boolean)) ' System.Boolean
Console.WriteLine(System.Runtime.InteropServices.Marshal.SizeOf(GetType(Boolean))) ' 4
Dim b As Boolean = True
Console.WriteLine(Len(b)) ' 2
Console.WriteLine(CType(b, Integer)) ' -1
Console.WriteLine(Convert.ToInt32(b)) ' 1