Java if-else语句的意外结果

Java if-else语句的意外结果,java,if-statement,Java,If Statement,这是我遇到的子程序: int x=3,y=9; if(x>=y) if(y>0) x=x*y; else if(x<4) x=x-y; intx=3,y=9; 如果(x>=y) 如果(y>0) x=x*y; 否则,如果(x您可以这样翻译代码: int x = 3, y = 9; if (x >= y) if (y > 0) x = x * y; else if (x < 4) x

这是我遇到的子程序:

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

否则,如果(x您可以这样翻译代码:

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

我的建议是:即使在1行if语句周围也要加上花括号。当然,好的缩进也可以帮你省去很多麻烦。在这种情况下,你会被
else if
实际上是第二个if而不是第一个if这一事实弄糊涂。所以你要做一个else if to
if(y>0)
而不是
if(x>=y)

这是由于一条规则,即如果括号中没有给出其他优先级,则
else
始终属于最新的

事实上,在您的情况下,如果
从未到达内部

if(x>=y)
    if(y>0)
        x=x*y;
    else if(x<4)
        x=x-y;
//代码格式已修复

//下次,请这样做:-)

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

如果像这样在每个表达式中添加大括号
{}
,它会更易于阅读,是一种良好的实践,并有助于维护代码。始终这样做,即使是对于单行程序,也不要嵌套其他内容或任何内容

看看这个:

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

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

if(x>=y)
...
3>=9吗

……不


这就是原因。

其他答案已经解释了这里发生的事情。我将引用Java语言规范来说明这背后的官方原因:

提供it then else语句的声明

如果其他声明:

if(表达式)语句NOSHORTIF else语句

StatementNoShortIf的描述如下:

声明NOSHORTIF:

不带牵引子状态的语句

标签状态NOSHORTIF

如果其他状态不受限制

当状态为NOSHORTIF时

ForStatementNoShortIf

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

因此,在下面的代码中

if(x>=y)
    if(y>0)
        x=x*y;
    else 
        if(x<4)x=x-y;
如果(x>=y)
如果(y>0)
x=x*y;
其他的

if(xMake)使用{}是为了代码的清晰。这就是为什么我总是喜欢
{}
@JNL清晰性不是这里的问题。正确性才是问题所在。@ThorstenDittmar这是一个方向,清晰性将使OP理解导致正确性的问题。我还喜欢在IDE中使用自动缩进和格式化,这会使嵌套变得明显。这种做法非常值得,大多数编码样式都采用这种方式把它看成是“必须遵循”。实际上,如果你知道规则,它就不值得了。另一方面,压痕在这里帮助了你很多。你可能想要修正你的答案。
int x=3, y=9;
if(x>=y)
{
  if(y>0)
  {
     x=x*y;
  }
  else if(x<4)
  {
      x=x-y;
  }
}
if(x>=y)
...
if(x>=y)
    if(y>0)
        x=x*y;
    else 
        if(x<4)x=x-y;