关于Else If的实施问题

时间:2010-11-11 23:53:47

标签: java .net c language-agnostic if-statement

我想知道之前是否实现了else,特别是为什么需要两个关键字,以及关键字未加入的原因。但是在python中,如果使用控制流语句,则将elif用作else。我想知道一般编译器如何解释else if。

编译器是否将else视为单个令牌?或者,如果只是一个具有隐式块范围的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 个答案:

答案 0 :(得分:8)

至少在C中,else if不是一个单独的语言结构。正如您猜测的那样,它与if (x) { ... } else { if (y) { ... } }没有区别。

在某些语言中(可能是Python就是其中之一),语法/空格规则不允许解析器正确解释else if,因此elif(或等效)构造。< / p>

答案 1 :(得分:5)

在C语言中,if语句的语法只是:

if (expression) statement [else statement]

语句可以是块语句,如下所示:

{ statement-list }

但它并非必须如此。所以在&#34;否则如果&#34; case,它只是一个else关键字,后跟一个语句,该语句恰好是if语句。

从概念上讲,它与此相同:

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

&#34;否则如果&#34;不会以&#34;或其他方式处理#34;或任何其他类似的构造。

答案 2 :(得分:3)

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

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

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

“否则,如果”不是特殊的,至少不是在C中。

答案 3 :(得分:2)

我假设if语句周围有一对隐含的paranthesis。

你怎么写

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}}

为了便于阅读,省略了paranthesis。

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");
}

答案 4 :(得分:2)

C#语言规范(4.0)第8.7.1节显示if语句的语法只是:

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

因此它将else if解析为else,后跟if语句。此行为模拟了C和C ++的行为。

答案 5 :(得分:1)

它不必将else if视为单个令牌,因为将elseif视为具有单独功能的两个单独令牌仍然有效。

例如:

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

在语义上等同于:

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

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