ブーリアン型ブーリアン型(ブーリアンがた、英: Boolean datatype)は、真理値の「真 = true」と「偽 = false」という2値をとるデータ型である。ブーリアン、ブール型、論理型(logical datatype)などともいう。2種類の値を持つ列挙型とも、2進で1ケタすなわち1ビットの整数型とも、見ることもできる。 また、各種ブール演算を行うことができ、論理積 ( AdaAda では、 type Boolean is (False, True);
p : Boolean := True;
...
if p then
...
end if;
比較演算子( ALGOLAlgol 60 にはデータ型として C言語C89の規格の範囲内では、ブーリアン型は存在せず、伝統的に 通例、値が 0 であれば偽であり、それ以外は真である。ただし論理否定演算子 真と偽の値に名前を付けて意味を明確にする際に、列挙型を使う方法もあるが、実際はプリプロセッサマクロが使われていることのほうが多い(Windows APIなど)。 typedef enum boolean { FALSE, TRUE } boolean_t;
...
boolean_t b = TRUE;
#define FALSE 0
#define TRUE 1
typedef int boolean_t;
...
boolean_t f = FALSE;
列挙型のほうが、型とその型の変数に代入してよい定数との対応が分かりやすい。デバッガの実装および利用時に関しても、マクロシンボルよりも列挙型のほうが有利である。また、プリプロセッサマクロは名前衝突時に予期せぬ動作を引き起こすこともある。いずれにしても、C99では標準で定義されたものがあるし、そうでなくても大抵の環境では処理系標準ライブラリなどのヘッダーファイル内で同様のシンボルが定義されていることが多いため、プログラマがユーザーコードで明示的に定義する必要はほとんどない。 なお、こういったシンボルを定義した場合、
そもそも、(条件 == TRUE) という表現は無意味に冗長であり、単に (条件) と書くべきである。もし、(条件 == TRUE) と書くことが何かを明示していて良い表現だというのなら、...(((条件 == TRUE) == TRUE) == TRUE) == TRUE... は、もっと良い表現だということになる(次を参照のこと http://www.kouno.jp/home/c_faq/c9.html#2 、亀がアキレスに言ったこと)。 C99C99ではブーリアン型を格納したりするための型が作られ、その型のためのキーワード #include <stdbool.h>
bool b = false;
...
b = true;
条件式の型などの意味は、C99でも変わっていないので注意すること。 ステータスコードと真偽値
0が偽、0以外が真というルールは、C言語文化圏で必ずしもいつもそうとは限らず、ライブラリやフレームワークによっては別のルールの場合もある。C言語文化圏で最も顕著な例はUnix等における終了ステータスの慣習であろう。正常を示す0が真、異常を示す0以外の残り全てが偽(エラーコード)という扱いであり、シェルのコマンド行中の →「終了ステータス」も参照
COMのステータスコードとして使われる32ビット整数の C11で標準化された また、比較などで「小なり」「等しい」「大なり」の3通りの意味を返したい、といった場合には、負の値・ゼロ・正の値、とするのが自然であるため、たとえば代表例の strcmp() 関数では、文字列が等しいということを示すためにゼロが返される。なお、単に「文字列が等しいか?」という比較をする場合などに、以下のように論理否定演算子 /* 論理否定演算子により、一見して「文字列が等しくない場合」であるかのように見えるが、実際は「文字列が等しい場合」を意味する。 */
if ( ! strcmp(cmd, "hello")) {
say_hello();
} else if ( ! strcmp(cmd, "hi")) {
say_hi();
...
...
} else if ( ! strcmp(cmd, "bye")) {
exit(0);
}
C++C++では、標準化の過程で ブーリアン型を出力するコードは以下のようになる。 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++ライブラリでは、 C#C#では、ブーリアン型は 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 DartDartでは、dart:core ライブラリに bool クラスがあり、true と false がそれの真偽値(とそのリテラル)である。(「他の多くの値は真として扱われる」という、他の多くの言語と違い)true 以外は全て偽として扱われる。さらに checked mode では、if文など真偽値が必要とされる場所では型チェックがされるため、他の型の値であった場合は型チェックでエラーになる。 ECMAScript→「§ JavaScript」を参照
FORTRANキーワード HaskellHaskell では JavaJavaでは、ブーリアンはプリミティブ型で 以下のようなコードはコンパイル時エラーとなる。 int i = 5;
if (i = 5) System.out.println("i is five"); // i == 5 の間違い。
if (i) System.out.println("i is not zero");
上記の例において、式 ブーリアン型を出力するコードは以下のようになる。 boolean myBool = (i == 5);
System.out.println("i == 5 is " + myBool);
この出力結果は次の通り。 i == 5 is true
JavaScriptJavaScriptにはBoolean型があり、それの真偽値(とそのリテラル)は true と false である。比較演算などの結果はBooleanの値になるが、論理演算子 && や || は引数を次で示すように扱って短絡評価し、結果はどちらかの引数の値となる。JavaScriptでは論理演算子やif文など真偽を必要とする場合に、それが真として扱われること(真となる値)を truthy(真値っぽい)、偽として扱われること(偽となる値)を falsy(偽値っぽい)と言う[4][5]。代表値 false の他、Undefined型の値、Null型の値、数値の 0 と −0 と NaN、空文字列( "" )、0n(BigIntの0)、以上の値が falsy であり、代表値 true の他、以上で述べた falsy である値以外の全ての値が truthy である。 なお標準仕様であるECMAScriptの規格票ではそのような用語を使わず、真偽値を評価する場所では §7.1.2(ECMA-262 7th Edition の場合)で示されている ToBoolean という操作を使って true か false かを得るといったように記述されている。 SchemeSchemeでは真偽値は MLML には - 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
OCamlOCamlも # 1 = 1 ;;
- : bool = true
PascalPascalでは、 var
value: Boolean;
...
value := True;
value := False;
if value then
begin
...
end;
なお、PascalをベースにしたDelphi言語(Object Pascal)には、 PerlPerlでは、集合型でないデータ型である数や文字列には区別がない(すべてスカラーと呼ばれる)。ブール演算では、要素を持たない集合型、空の文字列、値が 0 と等しい数値、文字列 集合型の要素は、存在するかしないかを評価されることもあり[6]、全ての変数は定義されているかいないかを評価されることがある[7]。ハッシュや配列の要素で値が Perl 5 では真理値を表す定数は組み込まれていないが、Raku (Perl 6) では存在している。 PythonPythonでは、以下のような値が偽として扱われる。他は真として扱われる。
Ruby等に慣れていると最後のようなオブジェクトの扱いを間違えることがあるので注意が必要である。 定数 比較演算などは 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>
>>>
PHPPHPの
等はFALSEと見なされる。 また、比較方法によっては厳密な比較を行うこともできる。 $a = 0;
print ( $a == false ); // trueと評価される。
print ( $a === false ); // falseと評価される。
print ( "0" == 0 ); // trueと評価される。
print ( 0 == "" ); // trueと評価される。
print ( "0" == "" ); // falseと評価される。緩やかな比較では推移律が成り立たない場合がある。
RubyRubyにはブーリアン型に相当するようなクラスは無く、 a = 0
if (a)
print "true"
else
print "false"
end
このコードは "true" を表示する。
p false.class
p true.class
p nil.class
とした場合、それぞれ "FalseClass"、"TrueClass"、"NilClass" が出力される。 SmalltalkSmalltalkでは value := true ifTrue: [ 1 ] ifFalse: [ 0 ].
上記はif文にあたる分岐の例で True methodsFor: 'basic'
!
ifTrue: aTrueBlock
ifFalse: aFalseBlock
^ aTrueBlock value.
!!
Smalltalkにおけるブール値はこのような構造になっているため、原則として他の言語の様に数値との相互変換が存在しない。ただし、 nil ifNotNil: [ :value | value ifTrue: [] ifFalse: [] ].
Visual BasicVisual Basic には 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オートメーションで使用される論理型 typedef short VARIANT_BOOL;
#define VARIANT_TRUE ((VARIANT_BOOL)-1)
#define VARIANT_FALSE ((VARIANT_BOOL)0)
VB.NETVisual Basic .NET (VB.NET) の 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
脚注
|