不同语言如何处理“悬挂其他”?

时间:2009-06-08 23:21:55

标签: language-agnostic

我经常看到悬挂的其他人处理为:

if (x > 0)
  if (y > 0)
    print "hello"
else
  print "world"

解析器或解释器实际上将else与最接近的if语句匹配,即“if(y> 0)”。

是否有任何语言存在实际上将else与外部if或最远匹配的陷阱? (除了显而易见的Python)

10 个答案:

答案 0 :(得分:6)

如果没有使用对空间敏感的语言(如Python所述),我不明白为什么任何合理的解释都会与最外面的if块匹配。

有些语言通过以下方式禁止这种潜在的歧义:

  1. 要求所有块的大括号,
  2. 提供特殊的“else if”语法,通常为elsifelifelseif

答案 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"

总是打印“真”或“假”