"else if"是一个关键字吗?

Is "else if" a single keyword?

本文关键字:一个 关键字 else if      更新时间:2023-10-16

我是c++新手。我经常看到这样的条件语句:

if 
  statement_0;
else if
  statement_1;

问题:

语法上,我是否应该将else if视为单个关键字?或者它实际上是在外部else内嵌套的if语句,如下所示?

if 
  statement_0;
else 
  if
    statement_1;

如果我们去看c++标准草案2.12 Keywords4分别列出了ifelse,没有else if关键字,它们不是一个单一的关键字。我们可以在关键字的cppreferences部分找到一个更容易访问的c++ 关键字列表。

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

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

else if中的ifelse项后面的语句。该部分还说:

[…选择语句中的子语句(每个子语句,在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不能是一个关键字,我们可以从我的回答can you start a class name with a numeric digit中的标识符语法中看到?标识符中不允许有空格,因此else if不能是单个关键字,而必须是两个单独的关键字

从语法上讲,它不是一个关键字;关键字不能包含空白。从逻辑上讲,在编写else if列表时,如果将其视为单个关键字可能会更好,并写:

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

编译器从字面上理解为:

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

但是两种形式的结果是一样的,第一种形式是far更具可读性。

不,它不是。
它们是两个关键字,而且,第二个"if"是由第一个"else"语句确定的范围内的子语句。

您可以使用大括号来查看作用域:

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

通常由两个不同的关键字实现,一个是if,一个是else

正如已经回答的那样,它不是。它们是两个关键词。它是两个语句的开头一个接一个。为了让它更清楚一点,下面是c++语言中处理ifelse语句的BNF语法。

 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++语法参考本页

elseif是两个不同的c++关键字。if语句可以后跟可选的else if语句。if语句可以有0个或多个else if,它们必须出现在else之前。

你可以找到语法和例子在这个if…Else语句教程

我只想在所有这些解释中加入我的观点。在我看来,如果你可以单独使用这些关键字,它们必须是两个关键字。也许你可以看看c++语法,从这个链接在stackoverflow:有标准的c++语法吗?

if语句后面可以跟一个可选的else if…Else语句,这对于测试使用单个if…Else if语句

在使用if、else if、else语句时,有几点需要注意。

一个if可以是0或一个else,并且必须在任何其他if之后。

一个if可以有0到多个其他if,它们必须出现在else之前。

一旦一个else if成功,其余的else if或else if都不会被测试。

看一看……Else语句教程