带有不可检查else的java IF语句
你能解释一下为什么下面显示的方法是由Java编译和运行的吗
public static void testIf(int v){
if (v < 10)
if (v >20 )
System.out.println(" 20 IF");
else
System.out.println(" 20 ELSE");
else
System.out.println("10 Else");
}
- 通常每个IF都应该与最近的ELSE链接,为什么最后一个ELSE不是悬挂的ELSE?而且与假设有联系李>
- 最后一个是无法访问的,为什么允许李>
提前感谢您的帮助
真诚地
# 1 楼答案
如果没有大括号,
if
可以接受一条语句——在本例中是if-else。因此,第一个else
匹配内部if
,第二个else
匹配外部if
。添加大括号并正确缩进代码使其更易于理解:# 2 楼答案
第二个{}属于第一个{},第二个{}和第一个{}属于第一个{}
# 3 楼答案
否则匹配如果
如果使用格式化程序,它将显示哪些If和else匹配:
你的假设“通常每个IF都应该与最接近的其他IF链接”并不完全正确。如果不使用花括号,If和else的主体是紧跟其后的第一条语句。这种情况发生在第二个最里面的if(见下面的规则)上,然后发生在第一个if上
Java如何选择要使用的其他工具将在Java Language Specification中讨论。特别是悬空else(其中有两个if和一个else)的情况,其解决方法如下:
当然,您的示例就是为什么您应该在每个if语句中添加花括号(和缩进),因为这样更清楚
可达性
在您的示例中,不可能达到“20if”语句,因为它要求V既小于10又大于20。虽然Java确实有一些无法访问的代码,但这并不是针对所有可能无法访问的条件的优化。Java Language Specification显示完成了哪些检查
有很多规则,但对于控制语句,它们只查看表达式是否为有效常量(始终为true或false)。对于if语句,甚至未执行此检查,因此它们可用于禁用一段代码:
# 4 楼答案
工作原理是这样的,如果v小于10,你应该得到打印值10
编辑:如果没有任何大括号,它看起来像这样;不知道如何格式化,所以请容忍我
# 5 楼答案
你中间的if else挡块
java将其视为外部if的内部块。我的意思是,您的代码编译为:
# 6 楼答案
如果你能很好地格式化你的代码,那就更有意义了
完全可以。因为当您没有
{}
时,只有一行代码绑定到作用域ifif
。然而,在您的例子中,if后面的下一行是另一行if
,因此范围仍然有效然而,这种逻辑看起来并不太好。但是代码仍然可以很好地执行
正如其他人指出的那样,为了让世界幸福,人们总是喜欢使用
{}
如果您的
v
值>= 10
是可访问的