Java 什么';是';对于';环

Java 什么';是';对于';环,java,for-loop,Java,For Loop,为什么以下情况会引发错误 for(; 0 ;) System.out.println("guess"); // or for(;false;) System.out.println("guess"); // or for(; 1 ;) System.out.println("guess"); 但以下各项运行正常(无限): 为什么它适用于true,而不适用于false?条件(即;s之间的位)必须是布尔值,因此这会立即排除第一个代码段中的第一个和第三个变体 现在

为什么以下情况会引发错误

for(; 0   ;)     System.out.println("guess");  // or
for(;false;)     System.out.println("guess");  // or
for(; 1   ;)     System.out.println("guess");
但以下各项运行正常(无限):

为什么它适用于
true
,而不适用于
false

条件(即
s之间的位)必须是布尔值,因此这会立即排除第一个代码段中的第一个和第三个变体

现在,第二个变量(您在其中使用了布尔值)没有编译,因为编译器意识到将永远不会输入循环,因此发出错误:

Untitled.java:3: error: unreachable statement for(;false;) System.out.println("guess"); ^ 1 error Untitled.java:3:error:unreachable语句 对于(;false;)System.out.println(“猜测”); ^ 1错误
请注意,JLS要求对无法访问的语句发布错误(请参阅):

如果由于无法访问语句而无法执行该语句,则为编译时错误。

如果
for
语句是可访问的,并且条件表达式不是值为
false
的常量表达式,则包含的语句是可访问的


Java需要一个布尔值作为循环头中的第二个参数,它对语句求值,如果语句返回true,jvm将运行循环体的代码,而不是跳过循环体

0和1显然不是布尔值,也没有定义可以计算的语句(如x
编辑:如果您提供“false”作为语句,JVM将注意到循环体永远无法到达,这将导致运行时错误

与C不同,在Java中,
true
false
对应于
boolean
类型值,其中1和0到
int
(事实上,在C中没有
boolean
声明类型,布尔检查是基于整数比较完成的。在Java中,事情是不同的)。

;是的始终为true,并且是有效条件
false
永远不会为真,因此无效。其余的都是不言自明的。
for(;;)
作为一个无限循环工作,too@AliAkber我建议您仔细阅读for循环()。正如它所说:
当终止表达式的计算结果为false时,循环终止
,因此您的循环甚至不会执行,因为它已经终止了。@marounnaroun这是有争议的。如果我在设计编译器的话,我可能会给它一个警告,但我确信也有理由让它成为一个错误;虚假的Java中的错误?刚在C#中测试过,它编译得很好,但它确实提供了一个警告,说明里面的代码无法访问(这是显而易见的)。@DrewKennedy是的,这是Java中的一个错误,可能是由于不断传播。@ElliottFrisch这是我的猜测。看起来很聪明,因为它是一个错误,无论如何都是完全无用的。这违反了JLS,对吗?编译良好:
if(false)System.out.println(“jls糟透了!”)
这也适用:
for(boolean b=false;b;b=false)System.out.println(“多么愚蠢的规则!”)
Untitled.java:3: error: unreachable statement
        for(;false;)     System.out.println("guess");
                         ^
1 error