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 toif(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;