过去我和我的一些编码朋友争论过,他们认为Java中的else if
语句只是语法糖,用else if
完成的任何事情都可以用序列{{1}完成。相反。
但今天我读到了一些我认为可能与此完全相反的内容。例如,以下代码if
。
int x = 1
如果你使用seriel if语句(没有else)你得到输出;
if(x >= 5){ System.out.println("First condition"); }
else if(x < 5){ System.out.println("Second condition"); }
else if (x < 2){ System.out.println("Third condition"); }
但是,除了上述其他if语句,你实际得到的是
Second Condition
Third Condition
因为Second Condition
陈述不会落空。因为第一个else if
运行,即使满足条件,也不会有其他运行。所以对我的问题。有没有办法用串行标准if语句来实现这种行为?
答案 0 :(得分:6)
else if
是一种语法糖,但不适用于 serial if
。
if (conditionA) {
} else if (conditionB) {
} else if (conditionC) {
}
相当于:
if (conditionA) {
} else {
if (conditionB) {
} else {
if (conditionC) {}
}
}
使用else if
结构的主要好处是减少了嵌套,这使代码更具可读性。
修改强>
正如其他答案所述,在java
中,上面甚至没有合适的语法糖(尽管有人可能会说,对于单个语句没有花括号的else块本身就是一个语法糖),有其他语言(例如perl
和ruby
和elsif
),其中有适当的语法。
答案 1 :(得分:4)
我部分不同意@Uri Agassi。
他是正确的,你不能(通常)重写:
if (condition1) { System.out.println("First condition"); }
else if (condition2) { System.out.println("Second condition"); }
else if (condition3) { System.out.println("Third condition"); }
作为
if (condition1) { System.out.println("First condition"); }
if (condition2) { System.out.println("Second condition"); }
if (condition3) { System.out.println("Third condition"); }
(您可以在条件可证明相互排斥且无副作用的情况下,但一般情况下不是这样。)
可以在没有if ... else
的情况下编写else
,但需要额外的标志变量; e.g。
boolean f = false;
if (condition1) {
System.out.println("First condition");
f = true;
}
if (!f && condition2) {
System.out.println("Second condition");
f = true;
}
if (!f && condition3) {
System.out.println("Third condition");
}
但是,当他说第一种形式是语法糖时,我不同意他的意思。 if语句的Java语法规则在JLS 14.5中给出:
IfThenStatement:
'if' '(' Expression ')' Statement
IfThenElseStatement:
'if' '(' Expression ')' StatementNoShortIf 'else' Statement
IfThenElseStatementNoShortIf:
'if' '(' Expression ')' StatementNoShortIf 'else' StatementNoShortIf
(“没有短暂的”是为了避免“悬挂其他”歧义。这与我的论证无关......)
我们通过在IfThenElseStatement中使用IfThenStatement或IfThenElseStatement作为Statement来获得else if
链接。请注意,语法没有提到大括号。大括号只是因为一个Statement可以是一个Block;再次见JLS 14.5。
因此,基于Java语法所说的,if ... else if ...
实际上只是IfThenStatement语法的一种自然形式,而不是一些特殊的语法糖。
现在,如果Java(假设)&gt;&gt;也&lt;&lt;像其他语言一样支持elsif
,您可以说elsif
形式是else if
的语法糖......但这与此不同。
...虽然有人可能会争辩说,对于单个语句没有花括号的else块本身就是一个语法糖
一个是不正确的: - )
这是一个普通的陈述;见上文。
常规始终使用大括号,但这不是语法,而忽略大括号并不需要任何糖。
答案 2 :(得分:1)
if语句的一般语法是:
if (condition) statement
或
if (condition) statement1 else statement2
现在问题是if
中的else if
是一般形式的statement2
的开头。
答案 3 :(得分:-3)
有没有办法用串行标准if语句来实现这种行为?
if(A){ System.out.println("a"); }
if(not A and B){ System.out.println("else B"); }
if(not A and not B and C){ System.out.println("else C"); }