我想知道之前是否实现了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();
}
}
我知道不同的语言和编译器可以以不同的方式实现它,但如果有人有关于特定语言(或编译器)的具体细节,我会有兴趣听到它们。
答案 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
视为单个令牌,因为将else
和if
视为具有单独功能的两个单独令牌仍然有效。
例如:
if (a) {
...
} else if (b) {
....
} else {
.....
}
在语义上等同于:
if (a) {
...
} else {
if (b) {
....
} else {
.....
}
}
大多数C风格语言的编译器都会为这两个示例生成完全相同的解析树,因为它们在语言的语法中是等效的。