【问题标题】:Is "else if" a single keyword?“else if”是一个关键字吗?
【发布时间】:2014-08-13 21:58:15
【问题描述】:

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

if 
  statement_0;
else if
  statement_1;

问题:

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

if 
  statement_0;
else 
  if
    statement_1;

【问题讨论】:

  • 到你的第二点。从语法上讲,它几乎总是写成else if
  • 不,因为那样会使语法更加复杂:单词是没有空格的单词。其他语言虽然有 elseifELIF 这样的关键字。事实上,只有(?)编程语言 Algol68 允许标识符中有空格;也不错:PROC walk through tree ()
  • Fortran(至少是固定形式的版本)和所有标准化的 Algol 版本都允许在任何地方使用空格。有一个故事是,打孔机在输入代码时很容易添加空格。另一个简单的说法是,允许在变量名中使用空格可以让程序员使用更好的名称,并且没有预见到问题。
  • VB和PHP中存在elseif关键字。
  • Nitpick:尽管 C++ 官方 没有包含空格的关键字,但它确实具有类似所有意图和目的的结构。例如,long double,你必须这样写。 longdouble 不正确。

标签: c++ syntax language-lawyer


【解决方案1】:

如果我们转到draft C++ standard 部分2.12 关键字4 分别列出ifelse,它们就不是一个关键字,并且没有else if关键词。我们可以通过转到cppreferences section on keywords 找到更易于访问的 C++ 关键字列表。

6.4 部分的语法也说明了这一点:

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

else if 中的if 是在else 术语之后的语句。该部分还说:

[...]selection-statement 中的子语句(每个子语句,在 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 ;
        }
    }
}

注意

我们还可以通过意识到 keywordsidentifiers 来确定 else if 不能是一个关键字,我们可以从我的回答中的标识符的语法中看到Can you start a class name with a numeric digit? 标识符中不允许有空格,因此else if 不能是单个关键字,而必须是两个单独的关键字

【讨论】:

  • 没有标准你能推导出来吗?在 ASM 中:jeq (if | else if)、jne (if | else if)、jmp (else)。基于此,我会说它是一个关键字……可能不是语法上的,而是指令上的。
  • @Brandon 我非常怀疑如果您不熟悉所使用的语法和编译器本身,您能否可靠地从汇编语言转到高级构造。
  • 虽然请注意,在解析器中定义语法时,此定义可能会导致美妙的“悬空 else”二义性语法树问题...
  • 有些语言不支持else if,而是支持elsif。在这些语言中,else if 确实是一个关键字。但是,如this answer所述,基于 C 的语言通常不会。
  • 我认为@Krumia 希望看到最终的else 声明。我也将不胜感激。
【解决方案2】:

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

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

编译器实际上将其视为:

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

但是这两种形式的结果是一样的,而且第一种很远 更具可读性。

【讨论】:

  • 实际上,编译器并没有看到字面上的 else 后跟 compound-statement。在else 之后,它会寻找statement(可能类似于return;f())或compound-statement...
  • @TheMask:根据 Shafik Yaghmour 的上述回答,编译器确实看到了一个语句,但 假装 它看到了一个复合语句。
  • 这个答案说明了解析器如何提取标记。很好。
【解决方案3】:

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

【讨论】:

  • 虽然这很好地描述了正在发生的事情,但您可能希望为实际的语言定义添加一些参考,以更好地证明您所说的。
  • @πάνταῥεῖ:您对参考资料的看法是对的,但 Shafik Yaghmour 已经完成了这项工作。他的回答是被接受的,我也投了赞成票。我的工作到此结束。
【解决方案4】:

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

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

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

【讨论】:

  • 所以我想那些坚持在接受复合语句的地方都应该使用花括号的人应该像这样写他们所有的非平凡条件,对吧? :)
  • 我认为一个人可以做任何事情,甚至是我们所有心爱的花括号。不要在家里这样做。
  • 所有的大括号结构语言(据我所知)需要花括号围绕所有子语句,即使由单个语句组成,也有一个单标记关键字意思是“如果”。我认为这很能说明问题。
  • @Zack:Swift 是一种打破常规的语言。即使对于单语句代码块,它也需要花括号,但没有“else if”关键字。另一方面,语法与 C 完全不同。if-statement 以可选的else-clause 结尾。 else-clause要么 else code-blockelse if-statementcode-block 包括强制大括号。所以else关键字后面只能跟{或者if
  • @GraniteRobert 我自己根本没有时间看 Swift,但这是一个有趣的数据点;我在想像这样的语法是一种可能性,但从未见过。你会注意到,这也避免了让人们写“else { if ... }”。
【解决方案5】:

正如已经回答的那样,它不是。它们是两个关键字。它是两个语句的开始,一个接一个。为了让它更清楚一点,这里是处理 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++ 语法取自this 页面。

【讨论】:

    【解决方案6】:

    elseif 是两个不同的 C++ keywordsif 语句后面可以跟可选的 else if...else 语句。 if 语句可以有零个或多个 else if,它们必须在 else 之前。

    您可以在if...else statement tutorial 中找到语法和示例

    【讨论】:

      【解决方案7】:

      我只想在所有这些解释中加入我的观点。在我看来,如果您可以单独使用这些关键字,它们必须是两个关键字。 也许您可以从stackoverflow中的此链接查看c ++语法: Is there a standard C++ grammar?

      问候

      【讨论】:

        【解决方案8】:

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

        当使用 if 、 else if 、 else 语句时,有几点需要牢记。

        if 可以有零或一个 else,它必须在任何 else if 之后。

        一个 if 可以有零个到多个 else if,它们必须在 else 之前。

        一旦 else if 成功,剩下的 else if 或 else 都不会被测试。

        看看if...else statement tutorial

        【讨论】:

        • 这只是不符合标准,而且是多余的。该语言具有将else if 模拟为关键字的所有表达能力,因此明确定义它是没有意义的。
        • 这对程序员来说是一个有用的简化。但问题不在于如何使用 if 语句。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-01-02
        • 1970-01-01
        • 2021-01-11
        • 2010-09-28
        • 2015-10-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多