
コンピュータサイエンスにおいて、ブール型(略してBool)は、論理とブール代数の2つの真偽値を表すことを目的とした、2つの値(通常はtrueとfalseで表される)のいずれかを持つデータ型です。これは、19世紀半ばに代数的な論理体系を初めて定義したジョージ・ブールにちなんで名付けられました。ブール型は主に条件文に関連付けられており、プログラマが指定したブール条件がtrueかfalseかに応じて制御フローを変更することで、異なる動作を可能にします。これは、より一般的な論理データ型の特殊なケースです。論理は必ずしもブールである必要はありません(確率論理を参照)。
Pascal、C、Python 、 Javaなどのブール型データ型を組み込んだプログラミング言語では、比較演算子(例えば、` and`など)は通常、ブール値を返すように定義されています。条件式や反復式を定義することで、ブール値の式をテストできます。>≠
C90やLisp のように明示的なブール型データ型を持たない言語でも、他のデータ型で真偽値を表すことができます。Common Lispでは、偽には空のリスト、真にはその他の値を使用します。C プログラミング言語では整数型を使用し、関係式i > jや論理式は&&、真の場合は 1、偽の場合は 0 の値を持つように定義されていますが、、など||のテスト部分は、ゼロ以外の値を真として扱います。[ 1 ] [ 2 ]実際、ブール変数は、1 つのバイナリ桁 (ビット) を持つ数値変数、または 2 つの値しか格納できない長さ 1 のビット列として見なされ (実装) ます。コンピュータでのブールの実装は、ビットではなく完全なワードとして表現されることがほとんどです。これは通常、コンピュータが情報のブロックを転送する方法によるものです。ifwhilefor
ほとんどのプログラミング言語は、明示的なブール型を持たないものであっても、論理積(AND、&、*)、論理和(OR、|、+)、等価性(EQV、=、==)、排他的論理和/非等価性(XOR、NEQV、^、!=)¬、および否定(NOT、~、!、¬)などのブール代数演算をサポートしています。
Ruby、Smalltalk、Aliceなどの一部の言語では、真と偽の値はそれぞれ別のクラス(例えば、Trueおよび)に属するため、単一のブール型はFalse存在しません。
SQLでは、NULLの特別な扱いのため、明示的な比較に3値論理を使用しますが、ブール型データ型(SQL:1999で導入)は2つ以上の真偽値を含むように定義されているため、SQLブール型はSQLの述語の評価から得られるすべての論理値を格納できます。ただし、ブール型の列は、真偽値のみに制限することもできます。TRUEFALSE
BOOLEAN明示的なデータ型を提供した最も初期のプログラミング言語の 1 つはALGOL 60 (1960 年) で、値はtrueとfalse、論理演算子は記号 ' で表されます。' (そして)、 '' (または)、 '' (暗示する)、 ''(同等性)および'' (not)。ただし、当時の多くのコンピュータでは入力デバイスと文字セットに制限があったため、ほとんどのコンパイラは、ANDやなどの演算子の代替表現を使用していました'AND'。
BOOLEAN組み込みの(プリミティブ型またはその他の事前定義された)データ型としてのこのアプローチは、Simula 67(1967年)、ALGOL 68(1970年)、[ 3 ] Pascal(1970年)、Ada(1980年)、Java(1995年)、C#(2000年)など、後の多くのプログラミング言語で採用されました。
C言語の初期実装(1972年)ではブール型が提供されておらず、今日に至るまでintCプログラムではブール値は一般的に整数(s)で表現されます。比較演算子(>、==など)は、符号付き整数(int)の結果を返すように定義されており、0(偽の場合)または1(真の場合)のいずれかになります。論理演算子(&&、、など)および条件テスト文(、 )は||、ゼロ(したがってNULLポインタまたはヌル文字列終端文字'\0'も)が偽であり、その他の値はすべて真であると想定しています。!ifwhile
米国規格協会版C言語であるANSI C (1989)に列挙型が追加enumされて以来、多くのCプログラマーは可読性を高めるために、独自のブール型を列挙型として定義するようになった。しかし、言語規格によれば列挙型は整数と同等であるため、Cプログラムにおいてはブール値と整数値の実質的な同一性は依然として有効である。
標準C ( C99以降)では、 と呼ばれるブール型が提供されています_Bool。C23 以降、ブール型は と呼ばれるコアデータ型となり、との値を持ちます (以前は、これらはヘッダー のマクロによって提供されていましたが、現在は廃止されています)。この言語は、任意の 2 つの真の値が等しいことを保証しています (これは、 型の導入前には実現不可能でした)。ブール値は引き続き整数として動作し、整数変数に格納でき、インデックス、算術、構文解析、書式設定など、整数が有効なあらゆる場所で使用できます。このアプローチ (ブール値は単なる整数である) は、以降のすべてのバージョンの C で維持されています。ただし、これは任意の整数値をブール変数に格納できるという意味ではありません。booltruefalsestdbool.h
C++にはC++98boolからブール型データ型が存在しますが、スカラー値やポインタ値からの自動変換はC言語と非常によく似ています。このアプローチは、後の多くの言語、特にAWKなどのスクリプト言語にも採用されました。
Dプログラミング言語には、適切なブール型がありますbool。このbool型は、true または false の値のみを保持できるバイトサイズの型です。bool 型のオペランドを受け入れることができる演算子は、&、|、^、&=、|=、^=、 !、&&、||、および?:のみです。値は任意の整数型に暗黙的に変換でき、false は 0 に、true は 1 になります。数値リテラル 0 と 1 は、それぞれ暗黙的にブール値の false と true に変換できます。式をキャストするとは、算術型の場合は0 または!=0を、ポインタまたは参照の場合はnullまたは!=nullをテストすることを意味します。boolbool
Objective-Cには、別のブール型データ型もありBOOL、可能な値は true または false でYES、NOそれぞれ true と false に相当します。[ 4 ]また、Objective-C はC のスーパーセットであるため、C99 をサポートする Objective-C コンパイラでは、C の_Bool型を使用できます。
Forth(プログラミング言語)にはブール型がなく、通常の整数を使用します。値0(すべてのビットが低)は偽を表し、-1(すべてのビットが高)は真を表します。これにより、数学的計算用と条件用の2つの論理演算子セットではなく、1つの論理演算子セットのみを定義できます。[ 5 ]
FORTRANの最初のバージョン(1957 年) とその後継のFORTRAN II (1958 年) には論理値や論理演算がありません。条件IF文でさえ算術式を受け取り、その符号に応じて 3 つの場所のいずれかに分岐します。算術 IF を参照してください。 しかし、 FORTRAN IV (1962 年) は、ALGOL 60 の例に倣い、ブールデータ型 ( LOGICAL)、真理リテラル (.TRUE.および.FALSE.)、論理IF文、ブール値の数値比較演算子 ( .EQ.、.GT.、 など)、および論理演算子 ( .AND.、.OR.、 および.NOT.) を提供しています。文では、論理値の解析またはフォーマットのためにFORMAT特定のフォーマット記述子 ( ' ) が提供されます。FORTRAN 77より前の一般的な拡張は、および演算子を拡張するか、ブール式を比較するための演算子を追加することでした。 [ 6 ] Fortran 77 では、および演算子を追加して操作を標準化しました。Fortran 90 では、代替比較演算子、、、、、 が追加されました。L.EQ..NE..XOR..EQV..NEQV.<<===/=>>=
Unityでは、(bool とも呼ばれる) の値はまたはのbooleanいずれかになり、スクリプトで使用されます。truefalse
Lisp (1958年)という言語には、組み込みのブール型データ型は存在しませんでした。代わりに、などの条件構文ではcond、論理値falseは空のリスト で表され、これは特殊アトムまたは()と同じであると定義されています。一方、その他のs 式はtrueとして解釈されます。便宜上、ほとんどの最新の Lisp 方言では、アトムの値が であると事前に定義されているため、 をtrueのニーモニック表記として使用できます。nilNILttt
このアプローチ(任意の値をブール値として使用できる)は、ほとんどの Lisp 方言(Common Lisp、Scheme、Emacs Lisp)で維持され、同様のモデルは、明確なブール型やブール値を持つものも含め、多くのスクリプト言語で採用されました。ただし、どの値がfalseと解釈され、どの値がtrue と解釈されるかは言語によって異なります。たとえば、Scheme では、false値は空のリストとは異なるアトムであるため、後者はtrueと解釈されます。一方、Common Lisp では、booleanシンボルの特殊化として派生した専用の型も提供されています。[ 8 ]
言語Pascal (1970) は、以前はCOBOL、FACT、JOVIALで異なる命名法で利用可能だった、プログラマ定義の列挙型の概念を普及させました。組み込みデータ型は、値とを持つBoolean事前定義の列挙型として提供されました。定義により、すべての比較、論理演算、条件文は と/または に適用され、値を返します。それ以外の場合、この型は、順序付けやインデックスとしての使用など、一般的な列挙型で利用できるすべての機能を備えていました。対照的に、と整数 (またはその他の型) 間の変換には、ALGOL 60 と同様に、明示的なテストまたは関数呼び出しが必要でした。このアプローチ (ブール値は列挙型です) は、 Modula、Ada、Haskellなど、列挙型を持つ後のほとんどの言語で採用されました。FALSETRUEBooleanBooleanBoolean
Perl has no Boolean data type. Instead, any value can behave as Boolean in Boolean context (condition of if or while statement, argument of && or ||, etc.). The number 0, the strings"0" and "", the empty list (), and the special value undef evaluate to false.[9] All else evaluates to true.
Lua has a Boolean data type, but non-Boolean values can also behave as Booleans. The non-value nil evaluates to false, whereas every other data type value evaluates to true. This includes the empty string "" and the number 0, which are very often considered false in other languages.
PL/I has no Boolean data type. Instead, comparison operators generate BIT(1) values; '0'B represents false and '1'B represents true. The operands of, e.g., &, |, ¬, are converted to bit strings and the operations are performed on each bit. The element-expression of an IF statement is true if any bit is 1.
Python, from version 2.3 forward, has a bool type which is a subclass of int, the standard integer type.[10] It has two possible values: True and False, which are special versions of 1 and 0 respectively and behave as such in arithmetic contexts. Also, a numeric value of zero (integer or fractional), the null value (None), the empty string, and empty containers (lists, sets, etc.) are considered Boolean false; all other values are considered Boolean true by default.[11] Classes can define how their instances are treated in a Boolean context through the special method __nonzero__ (Python 2) or __bool__ (Python 3). For containers, __len__ (the special method for determining the length of containers) is used if the explicit Boolean conversion method is not defined.
In Ruby, in contrast, only nil (Ruby's null value) and a special false object are false; all else (including the integer 0 and empty arrays) is true.
Rexx has no Boolean data type. Instead, comparison operators generate 0 or 1; 0 represents false and 1 represents true. The operands of, e.g., &, |, ¬, must be 0 or 1.
SQLでは、 WHERE句などの条件が必要な場合、ブール値は比較演算子、 IN演算子、IS(NOT)NULLなどの演算子を使用して生成される述語の形で現れます。ただし、これらの演算子はTRUEとFALSE以外にも、比較時にUNKNOWNと呼ばれる3番目の状態を生成することもあります。NULL
SQL92 標準では、述語を評価するIS (NOT) TRUE、IS (NOT) FALSE、およびIS (NOT) UNKNOWN演算子が導入されましたが、これはSQL:1999でブール型が導入される前のことです。
SQL:1999 標準では、オプション機能 (T031) としてBOOLEANデータ型が導入されました。NOT NULL制約によって制限されている場合、SQL BOOLEAN は他の言語のブール値と同様に動作し、 TRUEとFALSE の値のみを格納できます。ただし、他のすべての SQL データ型と同様にデフォルトで null 許容である場合は、特別な null 値も持つことができます。SQL 標準では、BOOLEAN型に対してTRUE、FALSE、 UNKNOWNの3 つのリテラルが定義されていますが、 NULL BOOLEANとUNKNOWN は「まったく同じ意味を表すために互換的に使用できる」とも述べています。 [ 12 ] [ 13 ]これは、識別によりUNKNOWN がNULL の等価比較規則の対象となるため、論争を引き起こしています。より正確には、 TRUEではなくUNKNOWN/NULLです。[ 14 ] 2012 年現在、T031 機能を実装している主要な SQL システムはほとんどありません。[ 15 ] Firebird とPostgreSQL は注目すべき例外ですが、PostgreSQL はUNKNOWNリテラルを実装していません。代わりに を使用できます。[ 16 ]UNKNOWN = UNKNOWNNULL
ブール値の扱い方は、SQLシステムによって異なります。
例えば、Microsoft SQL Serverでは、ブール値は単独のデータ型としても整数としても全くサポートされていません。列を WHERE 句で直接使用すると、「条件が期待されるコンテキストで、ブール型以外の式が指定されました」というエラー メッセージが表示され、のようなステートメントでは構文エラーが発生します。NULL以外の整数 0 と 1 しか格納できないBITデータ型は、ブール値を格納するための回避策としてよく使用されますが、整数とブール式の間で変換するために などの回避策を使用する必要があります。SELECTaFROMtWHEREaSELECTcolumnISNOTNULLFROMtUPDATEtSETflag=IIF(colISNOTNULL,1,0)WHEREflag=0
Access Database Engine (ACE/JET) [ 17 ]を使用するMicrosoft Accessにも、ブール型データ型はありません。MS SQL Server と同様に、BIT 型データ型を使用します。[ 18 ] Access では、これは Yes/No 型として知られており[ 19 ]、Yes (True) または No (False) の 2 つの値を取ることができます。Access の BIT 型データ型は数値で表すこともできます。True は-1、False は 0 です。[ 20 ] これは、どちらも Microsoft 製品であるにもかかわらず、MS SQL Server とは 2 つの点で異なります。
PostgreSQLには標準規格[ 21 ]と同様の独自のBOOLEAN型があり、述語をBOOLEAN列に直接格納したり、WHERE句でBOOLEAN列を述語として直接使用したりすることができます。
MySQLでは、BOOLEANは;のエイリアスとして扱われます。 [ 22 ] TRUEは整数 1 と同じで、FALSE は整数 0 と同じです。[ 23 ] 条件では、ゼロ以外の整数はすべて真です。TINYINT(1)
Tableau SoftwareにはBOOLEANデータ型があります。[ 24 ]ブール値のリテラルはTrueまたはですFalse。[ 25 ]
TableauのINT()関数はブール値を数値に変換し、Trueの場合は1、Falseの場合は0を返します。[ 26 ]
Tclには独立したブール型はありません。C言語と同様に、整数0(偽)と1(真、実際にはゼロ以外の任意の整数)が使用されます。[ 27 ]
コーディング例:
{ $v }の場合、 v を1 に設定します。 { puts "V は 1 または true" }上記は以下を示しますVは1または真です式は1と評価されるため。
{ $v }の場合、 v ""を設定します。 上記の場合、変数vは0または1として評価できないため、エラーが発生します。
プログラミング言語によっては、ブール型を期待するコンテキストで任意の式を評価できます。通常(プログラミング言語によって異なりますが)、数値のゼロ、空文字列、空のリスト、nullなどの式は false として扱われ、内容のある文字列(「abc」など)、その他の数値、オブジェクトは true として評価されます。これらの式のクラスは、偽値と真値と呼ばれることもあります。たとえば、Lispでは、nilや空のリストは false として扱われ、その他の値はすべて true として扱われます。C では、数値の 0 または 0.0 は false であり、その他の値はすべて true として扱われます。
JavaScriptでは、空文字列 ( "")、null、undefined、NaN、+0および[ 28 ]−0は、厳密に型チェックされたブール値と強制されたブール値を区別するために、偽値(その補数は真値)と呼ばれることがあります ( JavaScript 構文#型変換も参照)。[ 29 ] Python とは異なり、空のコンテナ (配列、マップ、セット) は真値とみなされます。PHP などの言語もこのアプローチを使用しています。false
{{cite web}}: CS1 maint: 数値名: 著者リスト (リンク)