web-dev-qa-db-ja.com

なぜブール値Javaはtrueまたはfalseのみを取りますか?なぜ1または0でもないのですか?

Javaブール値はtrueまたはfalseのみをとる理由はありません1または0また?

43
GuruKulki

Javaは、CやC++などの言語とは異なり、booleanを2つの異なる値(trueとfalse)を持つ完全に独立したデータ型として扱います。値1および0はint型であり、booleanに暗黙的に変換できません。

46
JaredPar

ブール値にはtrueまたはfalseの2つの値があるためです。これらは文字列ではなく、実際のブールリテラルであることに注意してください。

1と0は整数であり、それらを「代替true」と「代替false」(またはUnix終了コードに使用されるものと逆の方法で)にすることで物事を混乱させる理由はありません。 Javaでの強い型付けでは、プリミティブなブール値は2つだけでなければなりません。

編集:必要に応じて、変換関数を簡単に作成できることに注意してください。

public static boolean intToBool(int input)
{
   if (input < 0 || input > 1)
   {
      throw new IllegalArgumentException("input must be 0 or 1");
   }

   // Note we designate 1 as true and 0 as false though some may disagree
   return input == 1;
}

これはお勧めしませんが。 int変数が実際に0または1であることを保証できないことに注意してください。そして、1つが真を意味するという100%明白なセマンティクスはありません。一方、boolean変数はalwaystrueまたはfalseのいずれかであり、明らかです。これは真実を意味します。 :-)

そのため、変換関数の代わりに、真/偽の概念を表すすべての要素にboolean変数を使用することに慣れてください。ある種のプリミティブテキスト文字列を使用する必要がある場合(フラットファイルに保存する場合など)、「true」と「false」の意味ははるかに明確であり、ライブラリメソッド Boolean.valueOf

29
Andrzej Doyle

Javaを作成した人々は、ブール値が1または0ではなく、明確に真または偽を意味することを望んでいたためです。

1と0がブール値に変換される方法については、言語間で意見の一致はありません。 Cはゼロ以外の値を使用してtrueを意味し、0を使用してfalseを意味しますが、一部のUNIXシェルはその逆を行います。 intを使用すると、型チェックが弱くなります。これは、渡されたint値がブールコンテキストで使用されるべきものではない場合をコンパイラが保護できないためです。

17
Nathan Hughes

他の答えが指摘していないことの1つは、整数を真理値として扱わないことの利点の1つは、このC/C++バグ症候群を回避することです:

int i = 0;
if (i = 1) {
    print("the sky is falling!\n");
} 

C/C++では、=ではなく==を誤って使用すると、条件が予期せず「true」に評価され、iが偶発的な副作用として更新されます。

Javaでは、これはコンパイルエラーです。これは、割り当てi = 1の値がint型であり、その時点でbooleanが必要だからです。 Javaで問題が発生する唯一のケースは、次のようなラメコードを記述する場合です。

boolean ok = false;
if (ok = true) {  // bug and lame style
    print("the sky is falling!\n");
}

...オンスの「良い味」を持つ誰もが書くだろう...

boolean ok = false;
if (ok) {
    print("the sky is falling!\n");
}
16
Stephen C

関連するメモ:Javaコンパイラは int 表現します ブール値 JVMではブール型のサポートが制限されているため、 セクション3.3.4ブール型 を参照してください。

JVMでは、整数ゼロは false、およびゼロ以外の整数は 本当 (ソース: Inside Java Virtual Machine by Bill Venners)

3
sateesh

これについて特定すると、VBは-1であり、他の言語ではtrueは単なるゼロではありません。ブールフィールドをtrueまたはfalseのままにしておくと、Javaこの引数の外側。

3
Shaun F

C++にはbool(ブールの略)データ型がありますが。ただし、C++では、ゼロ以外の値はtrue負の数値を含む値です。 0(ゼロ)はfalseとして扱われます。 Javaのように、truefalseには別のデータ型ブール値があります。

1
ElectricGeek