'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中,true
和false
对应的是boolean
类型的值,其中1和0对应的是int
(其实,在 C 中没有 boolean
声明类型,布尔检查是基于整数比较完成的。在 Java 中,事情是不同的)。
为什么以下会引发错误?
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 isfalse
.
Java 需要一个布尔值作为循环头中的第二个参数,它会评估语句,如果语句 returns 为真,则 jvm 将 运行 循环体的代码, 不会跳过正文。
0 和 1 显然不是布尔值,它们也没有定义可以求值的语句(如 x < y),因为 java 是一种静态的强类型语言(不像 Python 或Perl) 它无法将 int 转换为布尔值,因此它崩溃了。
编辑:如果您提供 "false" 作为语句,JVM 将注意到永远无法到达循环体,这将导致 运行 时间错误。
与C不同,在Java中,true
和false
对应的是boolean
类型的值,其中1和0对应的是int
(其实,在 C 中没有 boolean
声明类型,布尔检查是基于整数比较完成的。在 Java 中,事情是不同的)。