簡體   English   中英

是-如果不是-是語法糖嗎?

[英]Is - `else if` - just syntactic sugar?

過去我一直認為與我的一些朋友編碼誰認為else if在Java語句只是語法糖,並與做過任何事情else if可以只用串行完成if代替。

但是今天我讀到了一些我認為可能與之矛盾的東西。 以下面的代碼為例,其中int x = 1

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

如果您使用seriel if語句(不包含else語句),則會得到輸出;

Second Condition
Third Condition

但是使用上述其他if語句,您實際得到的是

Second Condition

因為else if語句不會失敗。 因為else if運行其他第一個,即使滿足條件,也不會再有其他運行。 所以對我的問題。 有沒有一種方法可以使用串行標准if語句來實現此行為?

else if 語法糖,但if不是s,則不是連續的。

if (conditionA) {
} else if (conditionB) {
} else if (conditionC) {
}

等效於:

if (conditionA) {
} else {
    if (conditionB) {
    } else {
        if (conditionC) {}
    }
}

使用else if結構的主要好處是減少了嵌套,這使代碼更具可讀性。


編輯

正如其他答案所指出的那樣,在java ,以上代碼甚至都不是正確的語法糖(盡管可能會爭辯說,單個語句的沒有花括號的else塊本身就是語法糖),還有其他語言(例如perl和使用elsif ruby )那里有適當的語法。

我部分不同意@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但是需要額外的標志變量; 例如

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

但是當他說第一種形式是語法糖……適用於任何事物時,我不同意他的看法。 JLS 14.5中 ,if語句的Java語法規則為:

IfThenStatement:
    'if' '(' Expression ')' Statement
IfThenElseStatement:
    'if' '(' Expression ')' StatementNoShortIf 'else' Statement
IfThenElseStatementNoShortIf:
    'if' '(' Expression ')' StatementNoShortIf 'else' StatementNoShortIf

(“如果不是這樣的話”就是為了避免“晃來晃去”的模棱兩可。這與我的觀點無關……)

else if將IfThenStatement或IfThenElseStatement用作IfThenElseStatement中的語句,則會得到else if鏈接。 請注意,語法沒有提及大括號。 大括號的出現只是因為一個Statement可以是一個Block; 再次參見JLS 14.5

因此,根據Java語法的說法, if ... else if ...實際上只是IfThenStatement語法的自然形式,而不是某些特殊的語法糖。

現在,如果Java(假設地)>>也<<支持的elsif像其他語言一樣,您可能會爭辯說elsif形式是else if語法糖,但是...但這與此情形不同。


...盡管有人可能會說,一個語句沒有大括號的else塊本身就是一個語法糖

一個是不正確的:-)

這是一個普通的普通聲明; 往上看。

通常總是使用大括號,但這不是約定,不是語法,並且省略大括號不會帶來任何麻煩。

if語句的一般語法為:

if (condition) statement

要么

if (condition) statement1 else statement2

現在您的問題是, ifelse if
是從一般形式開始的那條statement2

有沒有一種方法可以使用串行標准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"); }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM