2010-11-11 87 views
1

我想知道如果之前有其他的实现,特别是为什么需要两个关键字,以及为什么没有加入关键字。但在python中,elif被用作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(); 
    } 

}

我知道,不同的语言和编译器可以不同的方式实现这一点,但如果任何人有特定的有关特定语言(或编译器)的详细信息我有兴趣听到它们。

+0

某些语言以“elif”或“elsif”或类似形式使用'单个标记'else if'。 *标记器不应该意识到语法 - 例如它只是吐出一系列的标记,并没有任何“更高”的结构(这样做会导致像Perl这样的语言...试图解析:p) – 2010-11-12 00:05:39

+0

在PHP中,你有两个。您可以编写'elseif'或'else if',并且会按照您的指示进行解释。 [Documentation](http://php.net/manual/en/control-structures.elseif.php) – MartinodF 2010-11-12 00:05:56

+2

@MartinodF:是的,PHP及其延迟的“双语法”... – 2010-11-12 00:08:28

回答

8

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

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

+0

与Perl相同,在if子句不是可选的之后忽略大括号。因此'elsif'令牌被创建。 – cdhowie 2010-11-12 00:13:48

+0

在C或Java中没有“else if”这样的东西。它纯粹是人造的。从代码可维护性角度来看,它甚至是危险的/昂贵的。例如,如果有人想要插入额外的代码或将语句记录到else子句中,例如在它是“else if”之前,但他们添加了“else printf(log);如果......”会完全破坏现有的逻辑......难以发现!但是,当使用大括号时,情况并非如此。 – user1697575 2013-01-15 22:21:00

2

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

的否则,如果(条件){行动}符号,正如你所描述的,是其他{如果(条件)的简写{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"); 
} 
3

在C,else if是两个关键字和下面实际上是相同的:

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

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

“否则如果“不是特别的,在至少不在C.

+0

我会说,从代码可维护性的角度来看,“假如”的人工构造甚至是危险/昂贵的。如果有人想要插入额外的代码或将语句记录到其他人,例如在它是“else if”之前,但他们添加了“else printf(log);如果......”会完全破坏现有的逻辑。但是,当使用大括号时,情况并非如此。 – user1697575 2013-01-15 22:18:26

1

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

例如:

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

在语义上等同于:

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

而且大多数编译器对C风格的语言将产生两个例子完全一样的解析树,因为他们是等价语言的语法。

5

在C中,一个if语句的语法是简单地:

if (expression) statement [else statement] 

语句可以是块语句,它看起来像:

{ statement-list } 

但它不没必要。因此,在“else if”情况下,它只是一个else关键字,后面跟着一条语句,该语句恰好是一条if语句。

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

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

“否则,如果”不处理任何不同,以“其他人,而”或其他任何类似的结构。

+0

用于讨论语法的+1。在这里很容易找到最好的答案。这都是关于语法如何指定语言的。 – 2010-11-12 00:08:28

2

C#语言规范(4.0)第8.7.1表明,对于if语句的语法就是:

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

所以它解析else ifelse后跟if声明。此行为模拟C和C++的行为。