ブーリアン型
[Wikipedia|▼Menu]

ブーリアン型(ブーリアンがた、: Boolean datatype)は、真理値の「真 = true」と「偽 = false」という2値をとるデータ型である。ブーリアン、ブール型、論理型(logical datatype)などともいう。2種類の値を持つ列挙型とも、2進で1ケタすなわち1ビットの整数型とも、見ることもできる。

また、各種ブール演算を行うことができ、論理積 (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の規格の範囲内では、ブーリアン型は存在せず、伝統的にintで代用される(C99の _Bool型とシンボルについては後述する)。標準の観点からは移植性・相互運用性は著しく悪化するが、集成体のサイズ削減などの観点から、型サイズが常に1バイトのunsigned charで代用されることもある(JNIヘッダー<jni.h>のjboolean型、COMヘルパー<rpcndr.h>のboolean型など)。

通例、値が 0 であれば偽であり、それ以外は真である。ただし論理否定演算子!による !0 のような式は、真の値の代表値として 1 を返すと標準規格で決められている。他に、ヌルポインタ浮動小数点数 0.0 のような、定数 0 と同様の値が偽として扱われる。

真と偽の値に名前を付けて意味を明確にする際に、列挙型を使う方法もあるが、実際はプリプロセッサマクロが使われていることのほうが多い(Windows APIなど)。typedef enum boolean { FALSE, TRUE } boolean_t;...boolean_t b = TRUE;#define FALSE 0#define TRUE 1typedef int boolean_t;...boolean_t f = FALSE;

列挙型のほうが、型とその型の変数に代入してよい定数との対応が分かりやすい。デバッガの実装および利用時に関しても、マクロシンボルよりも列挙型のほうが有利である。また、プリプロセッサマクロは名前衝突時に予期せぬ動作を引き起こすこともある。いずれにしても、C99では標準で定義されたものがあるし、そうでなくても大抵の環境では処理系標準ライブラリなどのヘッダーファイル内で同様のシンボルが定義されていることが多いため、プログラマがユーザーコードで明示的に定義する必要はほとんどない。

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

正しい例: if (cond) {...}、if (!cond) {...}、if (cond != FALSE) {...}、if (cond == FALSE) {...}

誤った例: if (cond == TRUE) {...}、if (cond != TRUE) {...}

好ましくない例: if (i < 0 == TRUE) {...}、if (i < 0 != TRUE) {...}、if (i < 0 == FALSE) {...}、if (i < 0 != FALSE) {...}

そもそも、(条件 == TRUE) という表現は無意味に冗長であり、単に (条件) と書くべきである。もし、(条件 == TRUE) と書くことが何かを明示していて良い表現だというのなら、...(((条件 == TRUE) == TRUE) == TRUE) == TRUE... は、もっと良い表現だということになる(次を参照のこと ⇒http://www.kouno.jp/home/c_faq/c9.html#2亀がアキレスに言ったこと)。
C99

C99ではブーリアン型を格納したりするための型が作られ、その型のためのキーワード _Bool が追加された。さらにその型と値のためにシンボル bool, false, true が、<stdbool.h> というヘッダファイルで定義される。C99規格では、boolをtypedefではなくマクロで実装することを規定している。#include <stdbool.h>bool b = false;...b = true;

条件式の型などの意味は、C99でも変わっていないので注意すること。
ステータスコードと真偽値

0が偽、0以外が真というルールは、C言語文化圏で必ずしもいつもそうとは限らず、ライブラリやフレームワークによっては別のルールの場合もある。C言語文化圏で最も顕著な例はUnix等における終了ステータスの慣習であろう。正常を示す0が真、異常を示す0以外の残り全てが偽(エラーコード)という扱いであり、シェルのコマンド行中の && や |。は終了ステータスの値をそのように扱って短絡評価の動作をする。これは、異常については「何が起きたのか」といったような情報が必要なことが多いため、といったような理由がある。「終了ステータス」も参照

COMのステータスコードとして使われる32ビット整数のHRESULT型は、ゼロを成功(S_OK)、正数を準成功(S_FALSE: 失敗ではないが否定的な状態[1])、負数を失敗(E_FAILなど)、とみなす。成否の判定のためにSUCCEEDED()/FAILED()マクロが用意されている。

C11で標準化されたerrno_t型はゼロを正常(エラーなし)とみなす[2]

また、比較などで「小なり」「等しい」「大なり」の3通りの意味を返したい、といった場合には、負の値・ゼロ・正の値、とするのが自然であるため、たとえば代表例の strcmp() 関数では、文字列が等しいということを示すためにゼロが返される。なお、単に「文字列が等しいか?」という比較をする場合などに、以下のように論理否定演算子!を使用したコードは一見不自然に見えるため、あえて(strcmp(s1, s2) == 0)と記述することで分かりやすさを向上する方法もある。/* 論理否定演算子により、一見して「文字列が等しくない場合」であるかのように見えるが、実際は「文字列が等しい場合」を意味する。 */if ( ! strcmp(cmd, "hello")) { say_hello();} else if ( ! strcmp(cmd, "hi")) { say_hi();......} else if ( ! strcmp(cmd, "bye")) { exit(0);}
C++

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

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

C#では、ブーリアン型は bool である。これは.NETのSystem.Boolean型のエイリアスであるが、Marshal.SizeOf()とsizeof演算子の結果はそれぞれ異なる[3]。Console.WriteLine(typeof(bool)); // System.BooleanConsole.WriteLine(System.Runtime.InteropServices.Marshal.SizeOf(typeof(bool))); // 4Console.WriteLine(sizeof(bool)); // 1bool 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文など真偽値が必要とされる場所では型チェックがされるため、他の型の値であった場合は型チェックでエラーになる。
ECMAScript「#JavaScript」を参照
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から整数型への暗黙の型変換は無い。

以下のようなコードはコンパイル時エラーとなる。int i = 5;if (i = 5) System.out.println("i is five"); // i == 5 の間違い。if (i) System.out.println("i is not zero");

上記の例において、式 i = 5 や i の結果はintと評価されるが、Javaのif文の条件式はC/C++と違いbooleanのみを受け付けるためコンパイルエラーとなる。

ブーリアン型を出力するコードは以下のようになる。boolean myBool = (i == 5);System.out.println("i == 5 is " + myBool);

この出力結果は次の通り。i == 5 is true

boolean のプリミティブラッパークラスは Boolean である。
JavaScript

JavaScriptにはBoolean型があり、それの真偽値(とそのリテラル)は true と false である。比較演算などの結果はBooleanの値になるが、論理演算子 && や |。は引数を次で示すように扱って短絡評価し、結果はどちらかの引数の値となる。JavaScriptでは論理演算子やif文など真偽を必要とする場合に、それが真として扱われること(真となる値)を truthy(真値っぽい)、偽として扱われること(偽となる値)を falsy(偽値っぽい)と言う[4][5]。代表値 false の他、Undefined型の値、Null型の値、数値の 0?0NaN、空文字列( "" )、0n(BigIntの0)、以上の値が falsy であり、代表値 true の他、以上で述べた falsy である値以外の全ての値が truthy である。

なお標準仕様であるECMAScriptの規格票ではそのような用語を使わず、真偽値を評価する場所では §7.1.2(ECMA-262 7th Edition の場合)で示されている ToBoolean という操作を使って true か false かを得るといったように記述されている。


次ページ
記事の検索
おまかせリスト
▼オプションを表示
ブックマーク登録
mixiチェック!
Twitterに投稿
オプション/リンク一覧
話題のニュース
列車運行情報
暇つぶしWikipedia

Size:30 KB
出典: フリー百科事典『ウィキペディア(Wikipedia)
担当:undef