从C ++标准第6.4.1节: if语句:
如果条件(6.4)产生真,则执行第一个子语句。如果是其他部分的选择 语句存在,条件产生错误,第二个 子语句被执行。在if语句的第二种形式(一种 如果第一个子语句也是if语句,则包括else) 那个内部的if语句应该包含一个else部分。
第6.4节:选择陈述:
Selection statements choose one of several flows of control.
selection-statement:
if ( condition ) statement
if ( condition ) statement else statement
condition:
expression
attribute-specifier-seqopt decl-specifier-seq declarator = initializer-clause
attribute-specifier-seqopt decl-specifier-seq declarator braced-init-list
我认为其他if(){} 声明是来自 if(){} 和 else {} 的单独声明。 现在看来这个 else if {} 语句只是一个else语句,里面有 if(){} ,所以这两个代码是相等的:
if(condition) {
}
else {
if(condition) {
}
}
if(condition) {
}
else if(condition) {
}
现在如果我们有多个if-s怎么办?这些代码在C ++中也是相同的:
if(condition) {
}
else {
if(condition) {
}
else {
if(condition){
}
}
}
if(condition) {
}
else if {
}
else if {
}
关于最后一个代码:当我们编写一个没有花括号的else语句时,只有第一个语句与 else 相关联,因为其他语句不属于 else (他们不是第一个声明的花括号)。因此,编译器说第二个 else 与if语句没有关联是不合逻辑的?
答案 0 :(得分:7)
if (condition) statement else statement
是一个选择语句。这意味着整个if...else
是之前else
的替代。
或者换句话说,你开始从底部汇总语句。
答案 1 :(得分:4)
else
是其对应的if
语句的一部分。在以下情况下:
if(condition) {
}
else if {
}
else if {
}
嵌套语句如下:
if (condition) { } else // first statement
if { } else // second statement
if { } // third statement
因此第二个else
与第二个if
相关联。
答案 2 :(得分:3)
这些规则的原因是解决称为Dangling else问题的问题。
它在这样的代码中崭露头角......
if (A)
if (B) DoB();
else DoC();
DoC()
何时执行?当A是假的时候会发生吗?或者当A为真且B为假时会发生吗?
编译器没有逻辑方式来解决这种情况。因此,在正常的解析规则之外,6.3声明在这种不明确的情况下,else属于 inner if语句。
答案 3 :(得分:1)
不,编译器说第二个else与if语句没有关联是不合逻辑的。