【发布时间】:2019-11-11 08:08:08
【问题描述】:
以下代码无法编译,因为x=3 无法访问
while (false) { x=3; }
但是为什么for( int i = 0; i< 0; i++) {x = 3;} 编译得很好?在此代码中,x=3 也无法访问。
【问题讨论】:
-
当然不可达,试试while(true)
标签: java
以下代码无法编译,因为x=3 无法访问
while (false) { x=3; }
但是为什么for( int i = 0; i< 0; i++) {x = 3;} 编译得很好?在此代码中,x=3 也无法访问。
【问题讨论】:
标签: java
见JLS 14.21, Unreachable Statements。
当 while 语句可达且条件表达式不是值为 false 的常量表达式时,包含的语句 [在 while 循环中] 是可达的。
false是一个常量表达式,其值为false,所以x=3;是不可达的。
如果 for 语句可到达且条件表达式不是值为 false 的常量表达式,则包含的语句 [在基本 for 循环中] 是可到达的。
i<0 不是常量表达式,因此包含的语句被认为是可达的,即使它实际上不可达。
【讨论】:
while 语句可以在编译时被证明不可达,而 for 语句需要在运行时检查才能发现它不可达。
如果你试试这个
int i = 0;
while(i>1) { i = 4; }
代码会编译得很好。
【讨论】: