if-else语句的意外结果

时间:2013-09-30 13:22:44

标签: java if-statement

这是我遇到的子程序:

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

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

7 个答案:

答案 0 :(得分:6)

我的建议:即使在1行if语句周围也要添加大括号。当然好的缩进也可以为你节省很多头痛。在这种情况下,你会感到困惑的是else if实际上是第二个而不是第一个if。因此,如果要if(y>0)而不是if(x>=y),请执行其他操作。

答案 1 :(得分:2)

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

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

看看这个:

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

答案 2 :(得分:1)

您可以像这样翻译代码:

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

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

作为一种好习惯,请使用大括号,并尝试使代码格式正确: e.g。

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

答案 3 :(得分: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;
}

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

答案 4 :(得分:0)

没有发生整个嵌套条件。外部条件的计算结果为false,因此跳过内部条件(if和else),将x保留为3.我同意评论者的观点,这就是为什么最好总是使用花括号来消除歧义。

答案 5 :(得分:0)

if(x>=y)
...

是3> = 9?

......不!

这就是原因。

答案 6 :(得分:0)

其他答案已经解释了这里发生了什么。我将引用Java语言规范的正式理由:

14.9. The if Statement提供了it-then-else语句的声明

  

IfThenElseStatement

     

if( Expression StatementNoShortIf else Statement

14.5. Statements中描述了

StatementNoShortIf

  

StatementNoShortIf

     

StatementWithoutTrailingSubstatement

     

LabeledStatementNoShortIf

     

IfThenElseStatementNoShortIf

     

WhileStatementNoShortIf

     

ForStatementNoShortIf

因此,通常if-then-else语句不能使用常规(“short”)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语句。