为什么我的if语句表现如此?

时间:2012-10-05 04:15:51

标签: java

今天我遇到了这个难题。显然,这不是正确的风格,但我仍然很好奇为什么没有输出。

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”。这是怎么回事?

谢谢!

4 个答案:

答案 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,并且控制不输入与该条件相关的代码,只是到达程序的末尾并且什么都不打印。

这就是为什么它的正常做法是用括号括起陈述,即使你正在写一个陈述。