例如:
if(cond1)
if(cond2) DoCond2();
else DoCond3();
else
声明是否会被视为第一个if
或第二个if
的其他声明?为什么? (从语法的角度来看是否有解释?)
其他基于C语言的编程语言(如C和Java)的答案是否相同?
注意:这不是作业。如果我不喜欢默认行为,我可以很容易地测试它,并使用大括号,但我很好奇它的原因。
编辑伙计们,显然原始示例中存在一个非常严重的错误。请再检查一次。我知道,这很令人尴尬。遗憾。
答案 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();
}
如果在if
或else
之后没有大括号,则只有第一个语句(在本例中为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}}语句,而不考虑结果。