前一段时间没有站在这样的路线之后:
if (arg)
invk(test);
else if (test)
{
alot();
stuff();
}
我决定自己在1920x1200次中更好地提高可读性,而不是省略{}
。
所以我编写了一个重新格式化现有代码的工具。
后来我注意到该工具中的一个错误导致了
if (x)
{
...
}
else if(y)
{
...
}
else if(z)
{
...
}
已被改变(不明显地改变行为)到:
if (x)
{
...
}
else
{
if(y)
{
...
}
else
{
if(z)
{
...
}
}
}
这让我意识到(无意)这实际上是else if
通过C的语法和语义规则所做的事。
所以甚至有一个像else if()
这样的语句存在,或者它只是滥用语义导致这个有用但是(为了这个目的让我们这么称呼)混淆起源的措辞打破了任何格式化规则而只是服务人类可读?
答案 0 :(得分:17)
根据C11
,章节§6.8.4,选择语句,可用的语句块是
if ( expression ) statement
if ( expression ) statement else statement
switch ( expression ) statement
,关于else
部分,
else
与词汇最接近的前if
相关联 语法。
因此,没有else if
构造,按照标准C
存在。
显然,if
(或if...else
)块可以作为else
块中的语句存在(嵌套if...else
,我们可以说)。
缩进的选择留给用户。
<强> 注意:的强>
只是要添加,没有理由存在单独的else if
构造,可以通过嵌套来实现功能。见this wiki article。相关报价
else if
语言系列中经常遇到的C
,以及COBOL和Haskell,不是语言功能,而是一组嵌套且独立的“ else“语句与特定源代码布局相结合。但是,这也意味着在这些语言中并不真正需要一个独特的else-if
结构。
答案 1 :(得分:2)
每个人都知道,有几种不同风格的编程语言。 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;
最后的 end-if's 相当难看。
正如@anatolyg所说,这就是为什么你有一个C语言的#elif语言。
Cobol-85对elseif语句有不同的看法。它提供了扩展的选择 / 案例语句。在Cobol你有一个评估:
evaluate option
when 1
...
when 2
...
但你也可以
evaluate true
when age > 21 and gender = 'male'
...
when age > 21 and gender = 'female'
在Cobol中你也可以混合使用case和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。