-3

这是我遇到的子程序:

int x=3,y=9;
if(x>=y)
  if(y>0)
     x=x*y;
  else if(x<4)
      x=x-y;

我猜我会得到-6作为答案。相反,我得到了 3 作为答案。谁能告诉我为什么?

4

7 回答 7

6

我的建议:即使在 1 行 if 语句附近,也要始终添加大括号。当然,好的压痕也可以省去很多麻烦。在这种情况下,您会因为事实上else if是第二个而不是第一个 if 的事实而感到困惑。所以你做一个 else if to if(y>0)not to if(x>=y)

于 2013-09-30T13:24:51.553 回答
2

X不大于或等于y。因此,永远不会执行所有属于您的第二个嵌套语句if(y>0)

如果{}像这样为每个表达式添加大括号,它会更容易阅读、良好的实践并有助于维护代码。即使对于 1-liners 也总是这样做,并且没有嵌套的 else 或任何东西。

看看这个:

int x=3, y=9;
if(x>=y)
{
  if(y>0)
  {
     x=x*y;
  }
  else if(x<4)
  {
      x=x-y;
  }
}
于 2013-09-30T13:24:57.600 回答
1

您可以像这样翻译您的代码:

int x = 3, y = 9;
if (x >= y)
    if (y > 0)
        x = x * y;
    else if (x < 4)
        x = x - y;

因此,您永远不会去分支:(x >= y)

作为一种好的做法,使用大括号并尝试保持代码格式正确:例如

    int x = 3, y = 9;
    if (x >= y) {
        if (y > 0) {
            x = x * y;
        }
        else if (x < 4) {
            x = x - y;
        }
    }
于 2013-09-30T13:24:44.230 回答
1

这是由于如果没有通过括号给出其他优先级,则else始终属于最新的规则。if

实际上,if在您的情况下,永远无法达到内部:

if(x>=y)
    if(y>0)
        x=x*y;
    else if(x<4)
        x=x-y;

这就是正在评估的内容。它相当于:

if(x>=y)
{
    if(y>0)
        x=x*y;
    else if(x<4)
        x=x-y;
}

事实上,x没有>= y任何计算被执行。如果你不想要这个,你需要明确地使用括号。

if(x>=y)
{
    if(y>0)
        x=x*y;
}
else if(x<4)
{
    x=x-y;
}

//代码格式固定
//下一次,所以这样做:-)

于 2013-09-30T13:24:52.620 回答
0

其他答案已经解释了这里发生了什么。我将引用 Java 语言规范作为其背后的官方原因:

14.9。if 语句提供了 it-then-else 语句的声明

IfThenElse 语句

if (表达式) StatementNoShortIf else语句

StatementNoShortIf14.5 中描述。声明

StatementNoShortIf

StatementWithoutTrailing 子语句

LabeledStatementNoShortIf

IfThenElse 语句NoShortIf

WhileStatementNoShortIf

ForStatementNoShortIf

因此,通常 if-then-else 语句不能使用常规(“短”)if 语句作为第一个参数。此外,它不能使用以“short”结尾的代码,如果喜欢:while(condition) if(condition2) statement作为第一个参数。这样 JLS 就避免了“挂起” else 语句的歧义。

因此,在下面的代码中

if(x>=y)
    if(y>0)
        x=x*y;
    else 
        if(x<4)x=x-y;

else不能归因于第一个 if 语句。

于 2013-09-30T13:36:20.943 回答
0
if(x>=y)
...

是 3 >= 9?

... 不!

这就是为什么。

于 2013-09-30T13:32:24.843 回答
0

整个嵌套条件都没有发生。外部条件评估为假,因此内部条件(if 和 else)都被跳过,将 x 保留为 3。我同意评论者的观点,这就是为什么最好始终使用花括号来消除歧义的做法。

于 2013-09-30T13:31:00.977 回答