悬挂 else 查询(或阅读错误代码的练习)

Dangling else query (or an excercise in reading bad code)

我正在阅读的书(C How to Program with an into C++ Global Edition,Deitel&Dietel,2016 年)给出了以下代码:请注意,这本书在练习部分,故意没有大括号和缩进。我想教你使用正确的缩进可以使阅读代码更容易。

int main(){
int x = 9, y = 11;
if (x < 10) 
if (y > 10)
puts("*****");
else
puts("#####");
puts("$$$$$");
}

输出为

*****
$$$$$

这本书指出编译器总是将 else 与前面的 if 相关联,除非通过大括号的放置告诉我们这样做,因此根据该逻辑,else 与

相关联
if (y > 10) 

这是真的,else 不应该执行,输出为

***** 

而不是

*****
$$$$$

所以我的问题是为什么这条线

$$$$$

在输出中?

这是你写的(相当于你的)

if (x < 10) { 
   if (y > 10) {  
      puts("*****");
   }else{
      puts("#####");
   }
}
puts("$$$$$");

它正在按照你说的去做。 else 与最接近的 if 匹配。这里y>10。当我们不使用括号时,ifelse 总是考虑单个语句。这里 if-else 块在外部 if 内用于单个语句的目的。与 else 一样,单个 puts("####") 也可以达到目的。不管xy的值是多少,最后的puts都会被执行。

[评论太长]

即使没有大括号,也很清楚如果正确缩进和换行(can be automated,顺便说一句):

int main() {
  int x = 9, y = 11;

  if (x < 10) 
    if (y > 10)
      puts("*****");
    else
      puts("#####");

  puts("$$$$$");
}