
コンピュータサイエンスにおいて、ブール型(スキッダーが使用することもある)は、論理とブール代数の2つの真偽値を表すことを目的とした、2つの値(通常は真と偽で表される)のいずれかを持つデータ型です。これは、19世紀半ばに代数的な論理体系を初めて定義したジョージ・ブールにちなんで名付けられました。ブール型は主に条件文に関連付けられており、プログラマが指定したブール条件が真か偽かに応じて制御フローを変更することで、異なる動作を可能にします。これは、より一般的な論理データ型の特殊なケースです。論理は必ずしもブールである必要はありません(確率論理を参照)。
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にはブール型のデータ型はありません。その代わりに、ブールコンテキスト(ifまたはwhileステートメントの条件、&&またはの引数||など)では、任意の値がブール値として振る舞うことができます。数値0、文字列"0"、""空のリスト()、および特殊値undefはfalseと評価されます。[ 9 ]それ以外はすべてtrueと評価されます。
Luaにはブール型データ型がありますが、ブール型以外の値もブール型のように振る舞うことができます。非ブール値はfalseと評価されますが、その他のデータ型の値はすべてtrueと評価されます。これには、他の言語でよく扱われるnil空文字列""や数値も含まれます。0false
PL/Iにはブール型データ型はありません。代わりに、比較演算子はBIT(1)値を生成します。'0'Bは偽、'1'Bは真を&表します。例えば、、、|などのオペランドは¬ビット列に変換され、各ビットに対して演算が実行されます。ステートメントの要素式はIF、いずれかのビットが1であれば真となります。
Python はバージョン 2.3 以降、標準の整数型である のサブクラスboolである型を持ちます。 [ 10 ]可能な値は と の 2 つで、それぞれ1 と 0 の特別なバージョンであり、算術コンテキストではそのように動作します。また、数値のゼロ (整数または小数)、null 値 ( )、空の文字列、空のコンテナ (リスト、セットなど) はブール値の false とみなされ、その他の値はすべてデフォルトでブール値の true とみなされます。[ 11 ]クラスは、特別なメソッド(Python 2) または(Python 3)を介して、インスタンスがブールコンテキストでどのように扱われるかを定義できます。コンテナの場合、明示的なブール変換メソッドが定義されていない場合は、 (コンテナの長さを決定するための特別なメソッド) が使用されます。intTrueFalseNone__nonzero____bool____len__
一方、Rubyでは、 nil(Rubyのnull値)と特殊なfalseオブジェクトのみがfalseであり、それ以外すべて(整数0や空の配列を含む)はtrueです。
Rexxにはブール型はありません。代わりに、比較演算子は0または1を生成します。0は偽、1は真を&表します。例えば、、、、|などのオペランドは¬0または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: 数値名: 著者リスト (リンク)