'for' 循环中的错误是什么?

What's the error in 'for' loop?

为什么以下会引发错误?

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

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

现在,您 使用布尔值的第二个变体无法编译,因为编译器意识到永远不会进入循环并因此发出错误:

Untitled.java:3: error: unreachable statement
        for(;false;)     System.out.println("guess");
                         ^
1 error

请注意,JLS 要求为无法访问的语句发出错误(请参阅 §14.21):

It is a compile-time error if a statement cannot be executed because it is unreachable.

...

The contained statement is reachable iff the for statement is reachable and the condition expression is not a constant expression whose value is false.

Java 需要一个布尔值作为循环头中的第二个参数,它会评估语句,如果语句 returns 为真,则 jvm 将 运行 循环体的代码, 不会跳过正文。

0 和 1 显然不是布尔值,它们也没有定义可以求值的语句(如 x < y),因为 java 是一种静态的强类型语言(不像 Python 或Perl) 它无法将 int 转换为布尔值,因此它崩溃了。

编辑:如果您提供 "false" 作为语句,JVM 将注意到永远无法到达循环体,这将导致 运行 时间错误。

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