为什么以下引发错误?
for(; 0 ;) System.out.println("guess"); // or
for(;false;) System.out.println("guess"); // or
for(; 1 ;) System.out.println("guess");
但以下运行正常(无限):
for(;true;) System.out.println("guess");
为什么它适用于true
但不适用于false
?
答案 0 :(得分:8)
条件(即;
s之间的位)必须是布尔值,因此这会立即排除第一个代码段中的第一个和第三个变体。
现在,第二个变量,你已经使用了布尔值,不会编译,因为编译器意识到循环永远不会被输入,因此会发出错误:
Untitled.java:3: error: unreachable statement for(;false;) System.out.println("guess"); ^ 1 error
请注意,JLS强制要求为无法访问的语句发出错误(请参阅§14.21):
如果语句因无法访问而无法执行,则为编译时错误。
...
如果
for
语句可以访问且条件表达式不是值为false
的常量表达式,则可以访问包含的语句。
答案 1 :(得分:1)
Java在循环头中需要一个布尔值作为第二个参数,它会对语句进行求值,如果语句返回true,则jvm将运行循环体的代码,而不会跳过正文。
0和1显然不是布尔值,也不定义可以评估的语句(如x< y),因为java是一种静态且强类型的语言(与Python或Perl不同),它不能将int转换为布尔值,所以它崩溃了。
编辑:如果您提供" false"作为语句,JVM将注意到永远无法访问循环体,这将导致运行时错误。
答案 2 :(得分:0)
与C不同,在Java中,true
和false
对应boolean
类型值,其中1和0到int
(实际上,在C中没有{ {1}}声明类型,布尔检查是基于整数比较完成的。在Java中,事情是截然不同的。)