别人问了我一道笔试题,这里记录一下
下面哪一项是错误的();
A.
public class Main {
public static void main(String[] args) {
int n = 100;
for (; ;) {
}
System.out.println(n);
}
}
B.
public class Main {
public static void main(String[] args) {
int n = 100;
while (n > 0)
;
System.out.println(n);
}
}
答案:A
下面解释一下,首先说明一下,循环有无花括号的区别:
有花括号,即花括号内为循环体,无花括号即认为截至到第一个分号为循环体。
for (int i = 0; i < 100; i++) {
System.out.println(i);
}
System.out.println("循环体外");
for (int i = 0; i < 100; i++)
System.out.println(i);
System.out.println("循环体外");
这里分for循环和while循环两种讨论:
for
//情况1 for循环内无条件,在循环外接语句,会报错
int i = 100;
for (;;);
System.out.println("循环体外");
idea检查会报错,Unreachable statement,表示不可达的声明,事实上,我们在进行编译时也会报错。
//情况2 for循环内有条件,在循环外接语句,未报错
int i = 100;
for (; i > 0;);
System.out.println("循环体外");
while
//情况1 循环内无条件,报错
int j = 100;
while ();
System.out.println("循环体外");
这里注意,报错原因并不是因为下一行代码不可达,而是Expression expected。
//情况2 循环体内有条件,在循环体外接语句,未报错
int j = 100;
while (j > 0);
System.out.println("循环体外");
综上所述,对于for循环和while循环来说,只要有循环条件,程序编译通过,他编译时不可能知道条件什么时候为true什么时候false,所以程序认为其循环体外之后的语句,是可能达到。尽管运行起来可能因为条件一直为true,为死循环跑不到,但编译是通过的。但对于没有条件的情况下,也就是相当于while(true)程序,程序在编译时知道这是死循环,后续语句不可能达到,则编译不通过报错。
注意while循环必须有循环条件,否则编译不通过,for循环则可以有可以没有。