是“如果......其他如果...其他......”与“if ... else {if ... else ...}”在语义上有什么不同?

时间:2018-04-10 09:32:02

标签: c if-statement language-lawyer

我相信你们所有人在学习C时都学会了这种语法:

if (condition 1) {
    statements
} else if (condition 2) {
    statements
} ...
else {
    statements
}

但在阅读N1570, § 6.8.4.1 The if statement之后,我发现绝对没有谈论链式else if语句,这与为此目的提供ElseIfelif等关键字的其他语言不同。 / p>

根据我的理解,整个if(...){...}else{...}是一个单一的陈述(else条款可能不存在,这是无关紧要的)。因此,在解析时,如下面的代码所示,

if (condition) {}
else
    one_statement;
if (condition) {}
else
    if (something else) {} else {}

第二个块中的缩进if语句等同于第一个块中的缩进one_statement;,就“一个语法'语句'单元而言”。

然后,由于C允许灵活的间距,因此聚合正数空格,制表符和换行符的任意组合都是等效的。因此,在重新分隔上面的代码之后,它变成了

if (condition) {
} else if (something else) {
} else {
}

我的理解是否正确?

1 个答案:

答案 0 :(得分:2)

  

我发现绝对没有谈论链接的其他if语句

那是因为关于链接if语句没有什么特别之处,而不是链接,例如if和循环。链接到else子句末尾的任何内容都成为该else子句的一部分:

if (x)
    ...
else if (y)
         ...
     else if (z)
             ...
          else
             ...

上面,if (y)属于else的{​​{1}}分支,以及其分支中的整个语句链。空白无关紧要,因此可以按照您在问题底部显示的方式对链进行重新格式化。

注意: C必须处理dangling else的特殊情况,但它会在if (x)嵌套时发生,而不是在链接时发生。