代码之家  ›  专栏  ›  技术社区  ›  Josh Smeaton

关于实施else if的问题

  •  2
  • Josh Smeaton  · 技术社区  · 14 年前

    我曾经想知道else if的实现,特别是为什么需要两个关键字,以及为什么这些关键字没有连接。但在Python中,elif用作else if控制流语句。我想知道一个通用编译器如何解释其他的if。

    编译器是否将else if视为单个标记?或者,如果只是一个具有隐式块作用域的else,它会转移到if下面吗?

    单个令牌:

    if (some_condition) {
        some_statement();
    }
    else_if (some_other_condition) {
        other_statement();
    }
    else {
        default_statement();
    }
    

    否则,如果:

    if (some_condition) {
        some_statement();
    }
    else { // compiler generated block scope 
        if (some_other_condition) {
             other_statement();
        }
        else {
            default_statement();
        }
    

    }

    我知道不同的语言和编译器可以以不同的方式实现这一点,但是如果有人对特定的语言(或编译器)有特定的详细信息,我会很感兴趣的。

    6 回复  |  直到 14 年前
        1
  •  8
  •   Oliver Charlesworth    14 年前

    至少在C中, else if 不是单独的语言结构。正如你所猜测的,这与 if (x) { ... } else { if (y) { ... } }

    在某些语言中(可能是Python),语法/空白规则不允许解析器解释 否则如果 正确,因此 elif (或同等)构造。

        2
  •  5
  •   caf    14 年前

    在C语言中,一个 if 声明很简单:

    if (expression) statement [else statement]
    

    陈述 可以是一个 BLOCK语句 ,看起来像:

    { statement-list }
    

    但不一定是。所以在“如果”的情况下,它只是一个 else 关键字,后跟一个语句,而该语句恰好是 如果 声明。

    从概念上讲,它与以下内容相同:

    if (x == 0) {
        return;
    } else while (x > 0) {
        foo(x--);
    }
    

    “else-if”与“else-while”或任何其他类似构造的处理方式没有任何不同。

        3
  •  3
  •   James McNellis    14 年前

    在C中, else if 是两个关键字,并且以下内容实际上是相同的:

    if (a) 
    {
    }
    else if (b) 
    {
    }
    

    if (a) 
    {
    }
    else 
    {
        if (b) 
        {
        }
    }
    

    “如果”不是特别的,至少在C中不是。

        4
  •  2
  •   Vladislav    14 年前

    我假设在if语句周围有一对隐含的偏执。

    你能写多少

    if(x==1)
       System.Console.WriteLine("1");
    else
       System.Console.WriteLine("2");
    

    而不是

    if(x==1)
    {
       System.Console.WriteLine("1");
    }
    else
    {
       System.Console.WriteLine("2");
    }
    

    else if(cond)action表示法,如您所描述的,是else if(cond)action的缩写。

    为了可读性,省略了偏执。

    if(x==1)
    {
       System.Console.WriteLine("1");
    }
    else
    {
       if (x==2)
       {
           System.Console.WriteLine("2");
       }
    }
    

    比…更难理解

    if(x==1)
    {
       System.Console.WriteLine("1");
    }
    else if(x==2)
    {
        System.Console.WriteLine("2");
    }
    
        5
  •  2
  •   Ron Warholic    14 年前

    C语言规范(4.0)第8.7.1节显示 if 声明只是:

    if (boolean-expression) embedded-statement else embedded-statement

    所以它分析 else if 作为一个 else 然后是 如果 声明。这种行为正在模拟C和C++的行为。

        6
  •  1
  •   cdhowie    14 年前

    不需要治疗 else if 作为一种象征,因为 else if 因为具有单独功能的两个单独的令牌仍然有效。

    例如:

    if (a) {
        ...
    } else if (b) {
        ....
    } else {
        .....
    }
    

    在语义上等价于:

    if (a) {
        ...
    } else {
        if (b) {
            ....
        } else {
            .....
        }
    }
    

    而且大多数C风格语言的编译器将为这两个示例生成完全相同的解析树,因为它们在语言的语法中是等价的。