5

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

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

4 回答 4

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,因此该块永远不会执行。

于 2012-10-05T04:19:33.527 回答
4

这:

if (x > 9) ... if (y > 8) ... else if (z >= 7) ... else

是模棱两可的,因为在解析过程中else可能会绑定到第一个if或第二个if。(这称为悬空else问题)。Java(和许多其他语言)处理这个问题的方式是使第一个含义非法,因此else子句总是绑定到最里面的if语句。

于 2012-10-05T04:22:24.557 回答
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");
于 2012-10-05T04:20:07.780 回答
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 语句指定的第一个条件为假,控制不进入与该条件相关的代码,只是到达程序的末尾并且不打印任何内容。

这就是为什么它的正常做法是用括号括起来语句,即使您正在编写单个语句。

于 2012-10-05T04:22:44.423 回答