今天我遇到了这个难题。显然,这不是正确的风格,但我仍然很好奇为什么没有输出。
int x = 9;
int y = 8;
int z = 7;
if (x > 9) if (y > 8) System.out.println("x > 9 and y > 8");
else if (z >= 7) System.out.println("SHOULD OUTPUT THIS x <= 9 and z >= 7");
else
System.out.println("x <= 9 and z < 7");
上面运行时没有输出。但是,当我们为if语句添加括号时,突然逻辑行为与我期望的一样。
int x = 9;
int y = 8;
int z = 7;
if (x > 9) {
if (y > 8) System.out.println("x > 9 and y > 8");
}
else if (z >= 7) System.out.println("SHOULD OUTPUT THIS x <= 9 and z >= 7");
else
System.out.println("x <= 9 and z < 7");
这输出“应该输出这个x <= 9且z> = 7”。这是怎么回事?
谢谢!
答案 0 :(得分:7)
如果你改写第一种方式(这就是它的表现方式),那就更容易理解了
if (x > 9)
if (y > 8) System.out.println("x > 9 and y > 8");
else if (z >= 7) System.out.println("SHOULD OUTPUT THIS x <= 9 and z >= 7");
else
System.out.println("x <= 9 and z < 7");
因为x不是> 9,块永远不会执行。
答案 1 :(得分:4)
此:
if (x > 9) ... if (y > 8) ... else if (z >= 7) ... else
含糊不清,因为在解析期间,else
可能会绑定到第一个if
或第二个if
。 (这称为the dangling else
problem)。 Java(以及许多其他语言)处理此问题的方法是使第一个含义非法,因此else
子句始终绑定到最内层的if
语句。
答案 2 :(得分:0)
只需修复代码上的缩进,问题就会变得清晰:
int x = 9;
int y = 8;
int z = 7;
if (x > 9)
if (y > 8)
System.out.println("x > 9 and y > 8");
else if (z >= 7)
System.out.println("SHOULD OUTPUT THIS x <= 9 and z >= 7");
else
System.out.println("x <= 9 and z < 7");
答案 3 :(得分:0)
因为您在最内层使用了else块
您的代码被视为以下代码
if (x > 9) // This condition is false, hence the none of the following statement will be executed
{
if (y > 8)
{
System.out.println("x > 9 and y > 8");
} else if(z >= 7)
{
System.out.println("SHOULD OUTPUT THIS x <= 9 and z >= 7");
}
else
{
System.out.println("x <= 9 and z < 7");
}
}
if语句指定的第一个条件是false,并且控制不输入与该条件相关的代码,只是到达程序的末尾并且什么都不打印。
这就是为什么它的正常做法是用括号括起陈述,即使你正在写一个陈述。