这是我遇到的子程序:
int x=3,y=9;
if(x>=y)
if(y>0)
x=x*y;
else if(x<4)
x=x-y;
我猜我会得到-6作为答案。相反,我得到3作为答案。谁能告诉我为什么?
答案 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语句的声明
14.5. Statements中描述了IfThenElseStatement :
if( Expression ) StatementNoShortIf else Statement
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语句。