注:本文不介绍分支与循环的基本概念,而是从一些细小的,易忽略的知识点入手,旨在帮助读者加深对分支与循环的理解。
一、悬空else问题
首先我们知道,当if语句要控制2条及以上的语句时,要用{}将执行语句括起来。
那么我们看下面这段代码。
#include <stdio.h>
int main()
{
int a = 0;
int b = 2;
if(a == 1)
if(b == 2)
printf("hehe\n");
else
printf("haha\n");
return 0;
}
它的运行结果是什么呢?
很多初学者会认为,上来先判断a==1,条件为false,而不加{}的if只能控制它下面的一条语句,所以if(b==2)不执行,于是执行else,最终打印”haha“。
那么我们看一下实际运行结果。
实际上什么也不输出,这是为什么呢?
原来,这就是悬空else问题,如果有多个if和else,可以记住这样⼀条规则, else 总是跟最接近的if匹配,所以这段代码else会与if(b==2)匹配,它们相当于一个整体,所以这与不加{}的if只能控制它下面的一条语句这条规则并不冲突,所以a==1判断为false之后,嵌套的if else就没机会执行啦,最终就什么都不输出。
代码改成以下就更容易理解了
#include <stdio.h>
int main()
{
int a = 0;
int b = 2;
if(a == 1)
{
if(b == 2)
printf("hehe\n");
else
printf("haha\n");
}
return 0;
}
二、goto语句
C语⾔提供了⼀种⾮常特别的语法,就是goto语句和跳转标号,goto语句可以实现在同⼀个函数内跳转到设置好的标号处。
#include <stdio.h>
int main()
{
printf("hehe\n");
goto next:
printf("haha\n");
next:
printf("跳过了haha的打印\n");
return 0;
}
goto语句如果使⽤的不当,就会导致在函数内部随意乱跳转,打乱程序的执⾏流程,所以我们的建 议是能不⽤尽量不去使⽤;但是goto语句也不是⼀⽆是处,在多层循环的代码中,如果想快速跳出使⽤ goto 就⾮常的⽅便了。
for(...){
for(...){
for(...){
if(disaster)
goto error;
}
}
}
error:
......
本来for循环想提前退出得使⽤break,一个break只能跳出一层循环,如果3层循环嵌套就得使⽤3个break 才能跳出循环,所以在这种情况下我们使⽤goto 语句就会更加的快捷。
1031

被折叠的 条评论
为什么被折叠?



