“否则”是单个关键字吗?


100

我是C ++的新手。我经常看到如下条件语句:

if 
  statement_0;
else if
  statement_1;

题:

语法上,我可以将其else if视为单个关键字吗?还是实际上是if在外部的嵌套语句,else如下所示?

if 
  statement_0;
else 
  if
    statement_1;

5
第二点。从句法上讲,它几乎总是写的else if
TheNorthWes 2014年

8
不,因为那样会使语法更加复杂:单词是没有空格的单词。其他语言也有类似elseif和的关键字ELIF。实际上,只有(?)编程语言Algol68允许标识符中包含空格;也太好了:PROC walk through tree ()
Joop Eggen 2014年

3
Fortran(至少是固定形式的版本)和Algol的所有标准化版本均允许在任何地方放置空格。有一个故事说,打孔卡打孔器显然在输入代码时倾向于添加空格。另一个简单的问题是,允许在变量名中使用空格将使程序员可以使用更好的名称,而没有预见到问题。
prosfilaes

1
elseif关键字存在于VB和PHP。
Salman

3
Nitpick:尽管C ++ 官方上没有带空格的关键字,但它确实具有针对所有意图的构造,并且目的就是这样工作的。例如,long double您必须以这种方式编写。longdouble是不正确的。
李斯特先生2014年

Answers:


133

他们不是一个关键字,如果我们去的草案C ++标准的部分2.12 关键词4同时列出if,并else分别并没有else if关键字。通过转到keyword的cppreferences部分,可以找到更易于访问的C ++ 关键字列表。

本节中的语法6.4也明确了这一点:

selection-statement:
 if ( condition ) statement
 if ( condition ) statement else statement

ifelse if一个声明中else项。本节还说:

[...] 选择语句中的语句(每个子语句,以if语句的 else形式)隐式定义了块作用域(3.3)。如果选择语句中的子语句是单个语句而不是复合语句,就好像它被重写为包含原始子语句的复合语句一样。

并提供以下示例:

if (x)
 int i;

can be equivalently rewritten as

if (x) {  
  int i;
}

那么如何稍微扩展一下示例呢?

if 
  statement_0;
else 
  if
    statement_1;
  else
    if
      statement_2 ;

将被解析为:

if 
{
  statement_0;
}
else
{ 
    if
    {
      statement_1;
    }
    else
    {
        if
        {
         statement_2 ;
        }
    }
}

注意

我们还else if可以通过认识到关键字标识符来确定不是一个关键字,并且可以从我的答案中的标识符语法中看出来。您可以用数字开头的类名吗?标识符中不允许使用空格,因此else if不能是单个关键字,而必须是两个单独的关键字


1
如果没有标准,您可以推断出这一点吗?在ASM中,其:jeqif| else if),jneif| else if),jmpelse)。基于此,我会说这是一个关键字。可能不是语法上的,而是指令上的。
Brandon 2014年

18
@Brandon我非常怀疑您是否可以在不完全了解所使用的语法和编译器本身的情况下,可靠地从汇编语言转到高级构造。
Shafik Yaghmour 2014年

虽然注意,这定义可能会导致美妙的解析器定义语法时“晃来晃去别的”暧昧语法树问题...
LinearZoetrope

2
有些语言不支持else if,而是支持elsif。在这些语言中,else if确实是一个关键字。但是,基于C的语言通常不会提供此答案。
sfdcfox 2014年

1
我认为@Krumia希望看到最后else声明。我也将不胜感激。
Matthias 2014年

78

从句法上讲,它不是一个关键字。关键字不能包含空格。逻辑上,写的列表时else if,它可能会更好,如果把它看成一个单一的关键字,并且写:

if ( c1 ) {
    //  ...
} else if ( c2 ) {
    //  ...
} else if ( c3 ) {
    //  ...
} else if ( c4 ) {
    //  ...
} // ...

编译器从字面上看是这样的:

if ( c1 ) {
    //  ...
} else {
    if ( c2 ) {
        //  ...
    } else {
        if ( c3 ) {
            //  ...
        } else {
            if ( c4 ) {
                //  ...
            } // ...
        }
    }
}

但两种形式都表现出相同的含义,第一种形式更具可读性。


1
实际上,编译器看不到字面else后跟compound-statement。之后else,它会寻找statement(可能像return;f())或一个compound-statement...
The Mask

@TheMask:按照Shafik Yaghmour的上述回答,编译器从字面上看只有一条语句,但假装它看到了复合语句。
Ilmari Karonen 2014年

该答案指示解析器如何提取令牌。好。
c

24

不它不是。
它们是两个关键字,此外,第二个“ if”是在由第一个“ else”语句确定的作用域“内部”的子语句。


2
尽管这很好地描述了正在发生的事情,但是您可能希望为实际的语言定义添加一些参考,以更好地证明您的言论。
2014年

2
@πάνταῥεῖ:您对参考文献的看法是正确的,但是Shafik Yaghmour的这项工作做得很好。他的回答是被接受的,我也投了赞成票。我的工作到此结束。
pablo1977年

16

您可以使用花括号查看范围:

if(X) {
  statement_0;
}
else {
  if(Y) {
    statement_1;
  }  
}

通常使用两个不同的关键字来实现,一个是if,另一个是else


因此,我认为那些坚持在任何复合语句被接受的地方都应使用花括号的人应该像这样写所有不平凡的条件,是吗?:)
dlf

5
我认为一个人可以做任何事情,甚至是我们所有心爱的花括号。不要在家做。
2014年

1
所有需要知道所有子语句都需要大括号的花括号结构的语言(据我所知),即使由单个语句组成,也都具有单令牌关键字,其含义为“ else if”。我认为这说明一切。
zwol 2014年

@Zack:Swift是一种违反规则的语言。即使对于单语句代码块,它也需要花括号,但是没有“ else if”关键字。在另一方面,语法是从C的完全不同的if-statement使用可选的端部else-clause。一个else-clause任一 else code-blockelse if-statementcode-block包括必需的花括号。因此,else关键字只能跟在{或之后if
GraniteRobert

@GraniteRobert我还没来得及看一下Swift,但这是一个有趣的数据点。我以为这样的语法是可能的,但从未见过。您会注意到,这也避免了人们写“ else { if ... }”。
zwol 2014年

10

正如已经回答的那样,不是。它们是两个关键字。它是两个陈述的开始,一个接一个。为了更清楚一点,这里是BNF gramar,它使用C ++语言处理ifand else语句。

 statement:      
    labeled-statement
    attribute-specifier-seqopt expression-statement
    attribute-specifier-seqopt compound-statement    
    attribute-specifier-seqopt selection-statement  
    attribute-specifier-seqopt iteration-statement    
    attribute-specifier-seqopt jump-statement  
    declaration-statement
    attribute-specifier-seqopt try-block

   selection-statement: 
         if ( condition ) statement
     if ( condition ) statement else statement

请注意,statement它本身包括selection-statement。因此,组合如下:

if (cond1)
   stat
else if(cond2)
   stat
else
   stat

根据C ++标准/语义是可能且有效的。

注意:C ++语法取材于此页面。


1

elseif是两个不同的C ++ 关键字。一个如果语句可以跟着一个可选否则,如果 ... 其他语句。一个如果语句可以有零个或多个否则,如果的,他们一定要来之前,其他

如果... else语句教程,您可以在此找到语法和示例。


-1

我只想在所有这些解释中加我的观点。如我所见,如果您可以分别使用这些关键字,则它们必须是两个关键字。也许您可以通过stackoverflow中的此链接查看c ++语法: 是否有标准的C ++语法?

问候


-1

if语句后可以是一个可选的else if ... else语句,这对于使用单个if ... else if语句测试各种条件非常有用。

使用if,else if,else语句时,要牢记几点。

一个if可以有零个或另一个,并且必须在其他if个之后。

一个if可以有零到多个其他if,并且它们必须比其他if早。

如果其他条件成功,则将不会测试其余任何其他条件。

看看if ... else语句教程


2
这只是不符合标准,而且是多余的。该语言具有所有模拟的表达能力,else if就好像它是一个关键字一样,因此明确定义它没有任何意义。
Ruslan 2014年

1
对于程序员来说,这是一个有用的简化。但是问题不在于如何使用if语句。
Cruncher 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.