論理値/真偽値のデータ型の各プログラミング言語別の概要

C言語

論理値の型はなく、true, false というキーワードもない。

if文などの条件式には、 NULL, 0, 0.0, '\x00' が入ると false の扱いになり、それ以外は true の扱いになる。

C++

boolという型があり、true, falseというbool型の値を表すキーワードがある。

if文などの条件式には、bool型のfalseの他にC言語と同様に NULL, 0, 0.0, '\x00' が入るとfalseの扱いになり、それ以外は true の扱いになる。

Go言語 (golang)

boolという型があり、true, falseというbool型の定数を表す事前宣言済み識別子がある。

Java

booleanというプリミティブ型があり、true, false というboolean型の値を表すキーワードがある。このプリミティブ型に対応するクラスは java.lang.Boolean である。

boolean型とjava.lang.Boolean型以外を if文などの条件式として入れるとコンパイルエラーになる。

Scala

Javaのbooleanに対応するScalaのクラスはscala.Booleanである。 scala._はデフォルトでインポートされているので、単にBooleanと書くだけで良い。 java.lang.Booleanとは別物だが、たぶん必要なところでは自動で変換されているのか、自分は違いを意識したことはない。

java.lang.Booleanと違って、JVM上ではscala.Booleanはそういうクラスのインスタンスではなく、 Javaのプリミティブ型booleanになっていているのではないか、と思っている。

値を表すにはJavaと同じく、true, false というキーワードを使う。

PHP

論理型があり、TRUE, FALSE というキーワードがある。 NULLと同じく大文字小文字が区別されない。

if文の条件式など、論理値が必要な箇所に FALSE, null, 0, 0.0, '', '0', array() があると FALSE の扱いになり、それ以外は TRUE の扱いになる。文字列 '0'FALSE だが、文字列 'FALSE''0.0'TRUE になる。

型の比較表 | PHP Manual
http://php.net/manual/ja/types.comparisons.php

// 以下は OK と表示される
if (TRUE == 1) {
  echo "OK\n";
} else {
  echo "NG\n";
}

// 以下は OK と表示される
if (TRUE == 2) {
  echo "OK\n";
} else {
  echo "NG\n";
}

// 以下は OK と表示される
if (FALSE == 0) {
  echo "OK\n";
} else {
  echo "NG\n";
}

// 以下は OK と表示される
if (FALSE == '') {
  echo "OK\n";
} else {
  echo "NG\n";
}

Python

bool という型があり、True, False という組み込みの定数がある。

if文の条件式など、論理値が必要な箇所に False, None, [], (), {}, "", 0, 0L, 0.0, 0j があると False の扱いになる。その他に nonzero()len() メソッドがあるオブジェクトで False0 を返すものも False の扱いになる。それ以外は True とみなされる。

実は True1 と同じで、False0 と同じらしい。

# 以下実行例は Python2 でも Python3 でも同じ

if (True == 1):
    print("OK")
else:
    print("NG")
# => OK と表示される

if (False == 0):
    print("OK")
else:
    print("NG")
# => OK と表示される

if (True == 2):
    print("OK")
else:
    print("NG")
# => NG と表示される

print(isinstance(False, bool)) # True
print(isinstance(True, bool))  # True
print(isinstance(False, int))  # True
print(isinstance(True, int))   # True

Ruby

true, false というキーワードがあり、それぞれ、TrueClass, FalseClass の唯一のインスタンスである。

if文の条件式など、論理値が必要な箇所に false, nil が入ると false の扱いになり、それ以外はすべて true の扱いになる。 0''[]true

TrueClass, FalseClass の共通のスーパークラスとして BooleanClass みたいなのがあるわけではない。その理由は以下の記事で解説されている。

RubyでBoolClassではなくTrueClass/FalseClassな理由を理解する | Qiita
http://qiita.com/yatemmma/items/3597a0e20556fb846d3f

JRuby

Rubyと同じ仕様で、true, false というキーワードがある。

Javaのライブラリに論理値を渡すときにはRubyの論理値から暗黙のうちにJavaの boolean または java.lang.Boolean に変換してくれるみたい。

逆にJavaのライブラリから文字列を受け取るときには boolean または java.lang.Boolean から暗黙のうちにRubyの論理値に変換してくれる。

Perl

論理値の型はなく、true, false というキーワードもない。

if文の条件式など、論理値が必要な箇所に 0, '0', '', undef, () が入ると false の扱いになり、それ以外は true の扱いになる。ただし、true を表す値としては 1 を使うことが多く、 false を表す値としては '' を使うことが多い。

このサイトは筆者(hydrocul)の個人メモの集合です。すべてのページは永遠に未完成です。