我经常看到悬挂的其他人处理为:
if (x > 0)
if (y > 0)
print "hello"
else
print "world"
解析器或解释器实际上将else与最接近的if语句匹配,即“if(y> 0)”。
是否有任何语言存在实际上将else与外部if或最远匹配的陷阱? (除了显而易见的Python)
答案 0 :(得分:6)
如果没有使用对空间敏感的语言(如Python所述),我不明白为什么任何合理的解释都会与最外面的if
块匹配。
有些语言通过以下方式禁止这种潜在的歧义:
elsif
,elif
或elseif
。答案 1 :(得分:3)
如果有任何语言(除了以缩进为中心的语言),他们将不得不进入“最糟糕的语言”列表之一。
这也是我几乎总是使用大括号进行条件化的原因,以及100%有嵌套条件或循环的时间。少数额外的角色值得消除混淆的可能性。
答案 2 :(得分:2)
在Perl中,大括号不是可选的,这有助于我们避免此类问题:
if ($x > 0) {
if ($y > 0) {
print "hello"
}
else {
print "world"
}
}
与
if ($x > 0) {
if ($y > 0) {
print "hello"
}
}
else {
print "world"
}
IIRC,大多数C风格指南要求/推荐用于循环和条件的大括号。
答案 3 :(得分:1)
C#做“正确”的事情。 Visual Studio的智能缩进自动将它放在正确的位置:
if (x > 0)
if (y > 0)
Console.WriteLine("hello");
else
Console.WriteLine("world");
这应该只是一个理论上的问题,因为在大多数C衍生物中添加卷曲的习惯应该根深蒂固,否则你就会开启令人讨厌的惊喜的可能性。
答案 4 :(得分:1)
在Python中你不能模糊不清。你要么
if (x > 0):
if (y > 0):
print "hello"
else:
print "world"
或
if (x > 0)
if (y > 0)
print "hello"
else:
print "world"
缩进显示“if”与“else”匹配。 [注意:尽可能尝试,我不能在第一个例子中得到“else”在第一个“if”下正确排列。]
在我看到的所有允许这种特殊模糊性的语言中,“else”与最新的“if”匹配。对于所有曾经存在的语言而言,这可能并非如此。通常,编写解析器时最简单的方法是将“else”与堆栈上最近的“if”匹配。
一个类似的问题:5 - 2 + 1的结果是什么?是4还是2?我个人总是在写(x - y)+ z或x - (y + z)时使用括号,因为我永远不会记得解析器的走向。
答案 5 :(得分:1)
C#的工作原理是它按照所用else语句的顺序匹配else语句。
即
if (x == 1)
if (y == 1)
Console.WriteLine("Hello");
else
Console.WriteLine("World");
else
Console.WriteLine("All your base are belong to us.");
但是,如果你想改变别人去的地方。
if (x == 1)
{
if (y == 1)
Console.WriteLine("Hello World");
}
else
Console.WriteLine("All your base are belong to us.");
答案 6 :(得分:0)
如果它与最近的if不匹配,要么整件事变得荒谬,要么你无法匹配其他ifs。这(我能想象的唯一真正的替代方案)没有意义:
if(first)
if(second)
if(third)
doFirst();
else
doSecond();
else
doThird();
这太重了。
答案 7 :(得分:0)
大多数语言都会将else
与最里面的if
匹配,这对于非空白敏感的编译器来说确实是唯一合理的事情。正如Jeff所提到的,许多IDE将格式化代码以匹配结构,但实际上,在所有代码块周围使用大括号是解决此问题的明智方法。
答案 8 :(得分:0)
COBOL在引入END-IF之前规定ELSE属于最近的IF。
对于除了前一个之外的其他一个,必须平衡具有相同数量的ELSE的IF。因为必须有必要,所以必须添加NEXT SENTENCE子句。与COBOL中的任何其他案例[1]一样,解决方案的选择似乎是最可想象的。
[1]:另外评估
答案 9 :(得分:0)
在 BBC BASIC 中,单行 IF 语句附加到右侧的下一个 ELSE,其中一个 ELSE 可能在多个 IF 之间共享。
IF A% THEN IF B% THEN PRINT "True" ELSE PRINT "False"
总是打印“真”或“假”