【问题标题】:Is "if ... else if ... else ..." any different from "if ... else { if ... else ...}" semantically? [duplicate]“if ... else if ... else ...”在语义上与“if ... else { if ... else ...}”有什么不同吗? [复制]
【发布时间】:2018-09-19 20:50:03
【问题描述】:

相信大家在学习C的时候都学过这个语法:

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

但是在阅读N1570, § 6.8.4.1 The if statement 之后,我发现完全没有谈论链接的else if 语句,这与其他为此目的提供诸如ElseIfelif 之类的关键字的语言不同。

根据我的理解,整个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 {
}

我的理解正确吗?

【问题讨论】:

  • 是的,你的理解是正确的。
  • 我可以发誓这是骗人的,但我找不到。
  • 美国科学

标签: c if-statement language-lawyer


【解决方案1】:

我发现没有任何关于链式 else if 语句的内容

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

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

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

注意:C 确实必须处理 dangling else 的特殊情况,但它发生在 ifs 嵌套时,而不是在它们被链接时。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-09
    • 1970-01-01
    • 1970-01-01
    • 2018-03-14
    • 2011-02-24
    • 1970-01-01
    相关资源
    最近更新 更多