由于花括号的原因,在进入if语句后进入else语句

4
这段代码示例正常运行,例如进入第一个if语句,不满足第二个if语句后退出。
if (i < _commandList.Count)
{
    if (output.Length > 0)
        Console.WriteLine(output);
}
else
    Console.WriteLine("Invalid Command.");

我最初编码如下,但不起作用。它进入第一个if,没有像预期的那样满足第二个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
使用花括号 - 问题解决了。 :) - user1477388
“缩进”并不意味着“命令排序”。 - Orel Eraki
3个回答

22

这是“悬挂else”问题:不论缩进如何,else总是属于最近的if

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


我的建议是:让你的IDE生成花括号并自动缩进代码。这个错误就不会再次发生了。 - Kirill Rakhman

11

dasblinkenlight的回答是正确的。我想要补充一下,这是一个更普遍的原则的实例,有时被称为最大匹配原则。也就是:当面对歧义时,分析器尝试尽可能识别出 当前可以识别到的最长内容

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

if ( 布尔表达式 ) 结果语句

if ( 布尔表达式 ) 结果语句 else 替代语句

所以当你有

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

解析器看起来像这样:

  • 我要尽可能地进行最大的语句。
  • 啊,有一个if。 我要尽可能地进行最大的if
  • 好的,在括号内里面是条件。
  • 然后是结果语句。 再次尝试尽可能地做出最大的语句
  • 有一个if。 再次尝试尽可能地做出最大的if语句。
  • 在括号内里面是条件。
  • 有结果语句。 有else吗? 是的!我们可以使这个if更大。
  • else的替代语句出现了,...我们完成了内部的if。 继续解析外部的if
  • else吗?没有。 我们无法让外部的if变得更大。

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


2

通过使用花括号,您告诉编译器else与第一个if语句相关联而不是第二个if语句。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接