C#中有两个ifs和一个else。怎么了?

时间:2011-07-01 07:12:37

标签: c# if-statement

例如:

if(cond1)
if(cond2) DoCond2();
else DoCond3();

else声明是否会被视为第一个if或第二个if的其他声明?为什么? (从语法的角度来看是否有解释?) 其他基于C语言的编程语言(如C和Java)的答案是否相同?

注意:这不是作业。如果我不喜欢默认行为,我可以很容易地测试它,并使用大括号,但我很好奇它的原因。

编辑伙计们,显然原始示例中存在一个非常严重的错误。请再检查一次。我知道,这很令人尴尬。遗憾。

4 个答案:

答案 0 :(得分:4)

根据MSDN

在嵌套的if语句中,如果没有相应的else,则else子句属于last。

同样是C和C ++,可以评估条件,其中0的结果为假,任何其他数字为真。在C#中,条件必须求值为布尔值true / false

修改 根据编辑它的嵌套if,所以内部的那个被评估为真,而其他的是内在的if

答案 1 :(得分:2)

  

else语句是否会被视为第一个if或第二个if的其他内容?

编辑(删除我原来在这里说的内容 - 它不适用):

有了这样的结构,我无法告诉你。每种语言的语法都不明确。

但我个人猜测它会“坚持”到最近的if。否则,某人几乎不可能阅读。

我会说尝试看看,但最好的解决方案是应用一个禁止人们做这个的编码标准......

  

为什么呢? (从语法的角度来看是否有解释?)

你可以查看每种语言的(通常是非正式的)语法定义,看看为什么这些语句会像他们一样挂在一起。

(旧的)官方C#语法:

http://msdn.microsoft.com/en-us/library/aa645596(v=VS.71).aspx

编辑但它对你没有多大帮助,因为在这种情况下,类似C语言的语法需要上下文或有意识的解决方法。

请参阅:http://en.wikipedia.org/wiki/Dangling_else#Context_Free_Solutions

  

其他基于C语言的编程语言(如C和Java)的答案是否相同?

语法是复杂的事情,并且嵌套范围正确有点困难。但总的来说,答案通常围绕block s vs statement s的定义。

您可以将statement定义为以;结尾的行。然后将block定义为由statement {包围的一系列}

因此,您可以将if语句定义为if block-or-statement [else block-or-statement],将[ ]表示为可选。

编辑:这个定义的问题在于这样的语法需要上下文,并且只能解决问题的原始表达式的问题。如果它真的含糊不清(作为你的新编辑版本),你必须有更高级别的处理(上下文)来处理歧义。

C ++,例如:

在最后一个文档中,您会看到“dangling else”。这具体描述了您正在寻找的内容。

这个问题存在于许多语言中,而不仅仅是C-like。这是您在BASIC变体中看到end if等明确陈述或if的{​​{3}}规则的原因之一。

答案 2 :(得分:1)

也许要了解这一点,添加大括号会很有用:

if(cond1) {
    DoCond1();
}
if(cond2) {
    DoCond2();
} else {
    DoCond3();
}

如果在ifelse之后没有大括号,则只有第一个语句(在本例中为DoCondX)属于if / else块。

编辑在编辑后查看代码:

if(cond1) {
    if(cond2) {
        DoCond2();
    } else {
        DoCond3();
    }
}

答案 3 :(得分:1)

让我们澄清if语句的工作原理。

if子句之后,你可以有两件事:

  • 单行声明
  • 多行声明

单行语句就像您提供的两个示例。在这种情况下,else只有在if之后才会属于{ }(就像您的第二个例子一样)。

多行语句在if语句后面会有大括号else。结束括号后面的if使其属于该声明。

您可以使用else if语法“链接”if语句。以下if将表现得像普通if,但仅当前一个if返回false时才会检查它。在您的示例中,将检查两个{{1}}语句,而不考虑结果。