有没有理由为什么Java布尔只采用true
或false
为什么不1
或0
?
答案 0 :(得分:46)
与C和C ++等语言不同,Java将boolean
视为完全独立的数据类型,它具有2个不同的值:true和false。值1和0的类型为int,不能隐式转换为boolean
。
答案 1 :(得分:29)
因为布尔值有两个值:true
或false
。请注意,这些不是字符串,而是实际的布尔文字。
1和0是整数,并且没有理由通过使它们成为“替代真实”和“替代假”(或者用于Unix退出代码的那种方式相反的方式来混淆事物?)。在Java中强类型时,应该只有两个原始的布尔值。
编辑:请注意,如果您愿意,可以轻松编写转换函数:
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;并且没有100%明显的语义意味着什么是真实的。另一方面,boolean
变量总是 true
或false
,显然哪一个是真的。 : - )
因此,代替转换函数,习惯于将boolean
变量用于表示真/假概念的所有内容。如果必须使用某种原始文本字符串(例如,用于存储在平面文件中),则“true”和“false”的含义更清晰,并且可以通过库方法{{3}立即转换为布尔值}。
答案 2 :(得分:17)
因为创建Java的人希望布尔值明确地表示真或假,而不是1或0。
关于1和0如何转换为布尔值,语言之间没有达成共识。 C使用1表示true,0表示false,但是一些UNIX shell执行相反的操作。使用int弱化类型检查,可以传入除1或0之外的整数值,编译器无法防范它。
答案 3 :(得分:16)
其他答案没有指出的一点是,不将整数视为真值的一个好处是它避免了这个C / C ++ bug综合症:
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");
}
答案 4 :(得分:3)
具体这一点让你远离VB中的整个TRUE是-1而在其他语言中,true就是NON ZERO。将布尔字段保持为true或false会使java保持在此参数之外。
答案 5 :(得分:3)
相关说明:java编译器使用 int 来表示 boolean ,因为JVM对布尔类型的支持有限。请参见Section 3.3.4 The boolean type。
在JVM中,整数零表示 false ,任何非零整数表示 true (资料来源:Bill Venners的Inside Java Virtual Machine)
答案 6 :(得分:1)
即使C ++中有bool(布尔值的缩写)数据类型。但是在C ++中,任何非零值都是包含负数的 true 值。 0(零)被视为 false 。在JAVA中,对于 true 和 false ,有一个单独的数据类型布尔值。
答案 7 :(得分:-3)
在c和C ++中,没有名为BOOLEAN的数据类型 这就是为什么它使用1和0作为真假值。 并且在JAVA 1和0中计为INTEGER类型,因此它在java中产生错误。并且java有自己的布尔值true和false,带有布尔数据类型。
快乐编程..