由于卷曲而在输入if语句后进入else语句

时间:2014-02-21 18:15:17

标签: c# if-statement

此代码示例正常工作,例如首先进入,如果不满足第2次就退出。

if (i < _commandList.Count)
{
    if (output.Length > 0)
        Console.WriteLine(output);
}
else
    Console.WriteLine("Invalid Command.");

我最初将其编码为此,但不起作用。如果符合预期,它会进入第一个if,不符合第二个,但是然后输入else语句并执行writeline。

if (i < _commandList.Count)
    if (output.Length > 0)
        Console.WriteLine(output);
else
    Console.WriteLine("Invalid Command.");

为什么第二个代码块与第一个块的工作方式不同?由于只有一行代码低于第一个语句,我认为不允许使用{}

作为参考,堆栈框架为:

_commandList.Count = 1
output.Length = 0
i = 0

3 个答案:

答案 0 :(得分:22)

这是“悬空else”问题:else始终属于最接近的,无论缩进如何。

您的第一个代码段使用花括号告诉编译器else属于顶部if,而不属于内部if。第二个片段让编译器决定;编译器应用最近的else规则,并将if附加到内部{{1}}。

答案 1 :(得分:12)

dasblinkenlight的回答是正确的。我想补充一点,这是一个更一般的原则的实例,有时称为最大munch原则。也就是说:当遇到歧义时,分析器会尝试使现在能够做到最长的事情

if语句有两种可能的形式:

if ( 布尔表达式 ) 后果陈述

if ( 布尔表达式 ) 后果陈述 else 替代陈述

所以当你有

if (c) if (d) E(); else F();

解析器看起来像这样:

  • 我打算尽力做出最大的声明。
  • 啊,有if。我将尝试制作最大的if我能。
  • 好的,括号内有条件。
  • 这是后果陈述。 再次,我将尝试做出我能的最大声明。
  • 有一个if。再一次,让我们尝试尽可能大的if陈述。
  • 括号内有条件
  • 有结果陈述。有else吗?是!我们可以使if更大。
  • else的替代陈述,......我们已经完成了内部if。继续解析外部if
  • else吗?不。我们不能让外if更大。

故事的寓意是:养成使用大括号的习惯

答案 2 :(得分:2)

通过指定大括号,您告诉编译器else使用第一个if而不是第二个if。