是 - 否则如果` - 只是语法糖?

时间:2014-03-22 10:09:11

标签: java if-statement

过去我和我的一些编码朋友争论过,他们认为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语句来实现这种行为?

4 个答案:

答案 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块本身就是一个语法糖),有其他语言(例如perlrubyelsif),其中有适当的语法。

答案 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"); }