悬挂 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
。当我们不使用括号时,if
和 else
总是考虑单个语句。这里 if-else
块在外部 if
内用于单个语句的目的。与 else
一样,单个 puts("####")
也可以达到目的。不管x
和y
的值是多少,最后的puts
都会被执行。
[评论太长]
即使没有大括号,也很清楚如果正确缩进和换行(can be automated,顺便说一句):
int main() {
int x = 9, y = 11;
if (x < 10)
if (y > 10)
puts("*****");
else
puts("#####");
puts("$$$$$");
}
我正在阅读的书(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
。当我们不使用括号时,if
和 else
总是考虑单个语句。这里 if-else
块在外部 if
内用于单个语句的目的。与 else
一样,单个 puts("####")
也可以达到目的。不管x
和y
的值是多少,最后的puts
都会被执行。
[评论太长]
即使没有大括号,也很清楚如果正确缩进和换行(can be automated,顺便说一句):
int main() {
int x = 9, y = 11;
if (x < 10)
if (y > 10)
puts("*****");
else
puts("#####");
puts("$$$$$");
}