是否存在else if语句?

前一段时间没有站在这样的线路之后:

if (arg) invk(test); else if (test) { alot(); stuff(); } 

我决定在1920×1200次中为自己提供更好的可读性,而不是省略{}

所以我写了一个工具来重新格式化我现有的代码。

后来我注意到该工具中的一个错误

 if (x) { ... } else if(y) { ... } else if(z) { ... } 

已经被改变了(没有通过不经意地改变行为)成:

 if (x) { ... } else { if(y) { ... } else { if(z) { ... } } } 

这让我意识到(无意识)这实际上是C语言和语义规则的其他内容。

那么甚至还有一个像else if()现有的声明,或者它只是滥用语义导致这个有用但是(为了这个目的让我们称它)混淆起源的措辞打破了任何格式化规则并且只是作为人类可读的?

根据C11 ,章节§6.8.4, 选择语句 ,可用的语句块是

 if ( expression ) statement if ( expression ) statement else statement switch ( expression ) statement 

而且,关于else部分,

if语法允许,则else与词法上最接近的前一个相关联。

因此,没有else if构造,按照标准C存在。

显然, if (或if...else )块可以作为else块中的语句存在(嵌套if...else ,我们可以说)。

缩进的选择留给用户。


注意:

只是要添加,没有理由存在单独的else if构造,可以通过嵌套来实现function。 请参阅此Wiki文章 。 相关报价

C语言系列中以及在COBOL和Haskell中经常遇到的else if不是语言特性,而是一组嵌套且独立的“if then else”语句与特定源代码布局相结合。 但是,这也意味着在这些语言中并不真正需要一个独特的else-if结构。

每个人都知道,有几种不同风格的编程语言。 elseif的存在基于语言风格。 在C / Pascal样式中, if语句是

 if (...) statment; else statement; 

你有一个复合陈述:{statment; statment; }

而你用的是Modula2 / VB /(python?)风格的语言

 if (...) statement; ... statement; else statement; ... statement; end-if 

在Modula2 / VB中你需要一个elseif语句,因为如果你尝试使用else,那么

 if (..) else if (..) else if (..) end-if; end-if; end-if; 

最后的结局是相当丑陋的。

正如@anatolyg所说,这就是你在C语言中使用#elif的原因。


Cobol-85对elseif语句有不同的看法。 它提供了扩展的Select / case语句。 在Cobol你有一个评价:

 evaluate option when 1 ... when 2 ... 

但你也可以这样做

 evaluate true when age > 21 and gender = 'male' ... when age > 21 and gender = 'female' 

在Cobol中你也可以混合表壳和if结构

 evaluate option also true when 1 also age > 21 and gender = 'male' .... when 1 also age > 21 and gender = 'female' .... when 2 also any .... 

你有时会看到java和C的最后一点

 if () { } else if () { } else if () { } 

为了所有意图和目的,这是用Java / C编写的VB / Modula-2。