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

sdi*_*ana 4 c# if-statement

这个代码示例正常工作,例如先进入,如果不符合第二个就退出.

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

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

if (i < _commandList.Count)
    if (output.Length > 0)
        Console.WriteLine(output);
else
    Console.WriteLine("Invalid Command.");
Run Code Online (Sandbox Code Playgroud)

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

作为参考,堆栈框架是:

_commandList.Count = 1
output.Length = 0
i = 0
Run Code Online (Sandbox Code Playgroud)

das*_*ght 22

这就是"晃来晃去else"的问题:无论压痕如何,else总是属于最接近的问题.

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


Eri*_*ert 12

dasblinkenlight的回答是正确的.我想补充一点,这是一个更一般的原则的例子,有时被称为最大蒙克原则.也就是说:当遇到歧义时,分析仪会尝试尽可能地做出最长的事情.

if声明有两种可能的形式:

if ( Boolean-expression ) 结果语句

if ( Boolean-expression ) 结果语句 else alternative-statement

所以,当你有

if (c) if (d) E(); else F();
Run Code Online (Sandbox Code Playgroud)

解析器看起来像这样:

  • 我打算尽力做出最大的声明.
  • 啊,有一个if.我会尽力做出最大的努力if.
  • 好的,括号内有条件.
  • 结果陈述来了.再一次,我将尽力做出最大的声明.
  • 有一个if.再次,让我们尝试做出最大可能的if陈述.
  • 括号内有条件
  • 有结果陈述.有else吗?是! 我们可以做得if更大.
  • 还有另一种说法else,......我们已经完成了内心if.继续解析外部if.
  • else吗?不,我们不能让外面if更大.

这个故事的寓意是:养成使用牙箍的习惯.