是否存在else if语句?

时间:2016-05-04 10:22:52

标签: c if-statement language-lawyer semantics

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

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()这样的语句存在,或者它只是滥用语义导致这个有用但是(为了这个目的让我们这么称呼)混淆起源的措辞打破了任何格式化规则而只是服务人类可读?

2 个答案:

答案 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。