此代码示例正常工作,例如首先进入,如果不满足第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
答案 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。