dhe*_*ein 12 c if-statement language-lawyer semantics
前段时间没有站在这样的线路之后:
if (arg)
invk(test);
else if (test)
{
alot();
stuff();
}
Run Code Online (Sandbox Code Playgroud)
我决定在1920x1200次中为自己提供更好的可读性,而不是省略{}.
所以我写了一个工具来重新格式化我现有的代码.
后来我注意到该工具中的一个错误
if (x)
{
...
}
else if(y)
{
...
}
else if(z)
{
...
}
Run Code Online (Sandbox Code Playgroud)
已被改变(不明显地改变行为)成:
if (x)
{
...
}
else
{
if(y)
{
...
}
else
{
if(z)
{
...
}
}
}
Run Code Online (Sandbox Code Playgroud)
这让我意识到(无意)这实际上是else if通过C的语法和语义规则做的事情.
那么,有没有甚至像一个陈述else if()现有或只是语义的滥用的结果在这个有用的,但(让我们称之为它,以便用于此目的)混淆起源措辞,打破任何格式化规则,只是作为人类可读?
Sou*_*osh 17
根据C11章节§6.8.4,选择语句,可用的语句块是
if ( expression ) statement
if ( expression ) statement else statement
switch ( expression ) statement
Run Code Online (Sandbox Code Playgroud)
而且,关于这else部分,
An
else与if语法允许的词法最接近的前一个相关联.
因此,没有else if按照标准存在的构造C.
很显然,一个if(或if...else)块可以作为存在声明中else块(嵌套if...else,我们可以说).
缩进的选择留给用户.
注意:
只是添加,没有理由else if存在单独的构造,可以通过嵌套来实现功能.请参阅此Wiki文章.相关报价
else if在C语言系列中以及在COBOL和Haskell中经常遇到的不是语言特性,而是一组嵌套且独立的"if then else"语句与特定的源代码布局相结合.但是,这也意味着else-if在这些语言中并不真正需要一个独特的结构.