悬挂其他查询(或阅读不良代码的练习)

时间:2018-01-05 16:09:49

标签: c dangling-else

我正在阅读的书(C如何编写进入C ++全球版,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不应该执行,给出

的输出
***** 

而不是

*****
$$$$$

所以我的问题是为什么行

$$$$$
输出中

2 个答案:

答案 0 :(得分:4)

你写的(相当于你的)

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

它跟随你所说的。 else与最近的if匹配。这里y>10。当我们不使用括号时,ifelse始终会考虑单个陈述。外部if-else内的if块用于单个语句的目的。 elseputs("####")用于此目的的方式相同。无论putsx的值是多少,都会执行最后一次y

答案 1 :(得分:4)

[评论太久了]

即使没有大括号,也很清楚如果正确缩进和换行(can be automated,BTW)会发生什么:

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

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

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