2013-03-17 97 views
4

1.这个java for循环条件有什么问题?

for (int i = 0; (boolean)true; i++) { 

} 

2.

for (int i = 0; (boolean)false; i++) { 

} 

3.

boolean t=false; 
for (int i = 0; t; i++) { 

} 

第一个for循环编译 & 运行,但第二个for循环compilation fails with error。它说Unreachable Statement。而第三个循环编译 & 运行

+2

现在,如果您在'boolean t = false;'之前添加'final',它将不会再次编译。这完全是关于编译器可以保证的。 – 2013-03-17 07:13:54

回答

4

第一个循环是无限循环。由于条件是总是为真,并且总会得到满足。

这就像写:

int i=0; 
while(true) 
    i++; 

正如你所看到的,该条件始终true并没有什么变化这是真的。

第二个循环是Unreachable code,因为永远不会到达此循环下面的一段代码(false永远是false,您永远不会更改它)。所以这是多余的。

请参阅第14.21节。 Unreachable Statements

由于Java知道程序员是人类:)它会通知你这个以防止错误。

注意while(false)或者你有第二循环从if(false)...不同,因为while(false)(或者你有循环)是没有意义的,因为它下面的代码将不被执行。不像if(false)可能有else,所以在这种情况下编译器不会抱怨它。


关于OP更新:

在第三种情况下不会有任何编译错误,因为false值分配给变量和在这种情况下,该变量可以被重新分配到它有true的价值。所以编译器不会出现错误。 请注意,如果变量被声明为final,那么编译器会出现错误,因为此变量永远不会被分配给新值,因此for循环下的代码将为无法访问

+1

+1对于更新(我即将添加)。一个简单的可能是双循环。 – dreamcrash 2013-03-17 07:11:58

+0

不错的答案+1。 – gontard 2013-03-17 07:23:44

0

在第二for环,条件是总是false所以for块(即使是空的)将永远不会被执行(它是unreacheable)。

像在这种情况下:

if (false) { 
} 
0
for (int i = 0; <This_has_to_be_true>; i++) 

的for循环的第二部分必须是真实的循环来执行。由于您手动将其设置为fase,所以循环将永远不会运行,因此它内部的代码无法访问。

0

编译器告诉你第二个循环内部的代码(即使是空的)从不会到达并执行,因为条件总是false

顺便说一句,为什么你试图做到这一点?