这是我遇到的子程序:
int x=3,y=9;
if(x>=y)
if(y>0)
x=x*y;
else if(x<4)
x=x-y;
我猜我会得到-6作为答案。相反,我得到了 3 作为答案。谁能告诉我为什么?
这是我遇到的子程序:
int x=3,y=9;
if(x>=y)
if(y>0)
x=x*y;
else if(x<4)
x=x-y;
我猜我会得到-6作为答案。相反,我得到了 3 作为答案。谁能告诉我为什么?
我的建议:即使在 1 行 if 语句附近,也要始终添加大括号。当然,好的压痕也可以省去很多麻烦。在这种情况下,您会因为事实上else if
是第二个而不是第一个 if 的事实而感到困惑。所以你做一个 else if to if(y>0)
not to if(x>=y)
。
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;
}
}
您可以像这样翻译您的代码:
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;
}
}
这是由于如果没有通过括号给出其他优先级,则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;
}
//代码格式固定
//下一次,所以这样做:-)
其他答案已经解释了这里发生了什么。我将引用 Java 语言规范作为其背后的官方原因:
14.9。if 语句提供了 it-then-else 语句的声明
IfThenElse 语句:
if (表达式) StatementNoShortIf else语句
StatementNoShortIf在14.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 语句。
if(x>=y)
...
是 3 >= 9?
... 不!
这就是为什么。
整个嵌套条件都没有发生。外部条件评估为假,因此内部条件(if 和 else)都被跳过,将 x 保留为 3。我同意评论者的观点,这就是为什么最好始终使用花括号来消除歧义的做法。