一、分支跳转语句
if
格式1 : 一条路
If (表达式语句) //判断语句
{
...//执行语句;
}
逻辑过程:会先来判断括号当中的表达式语句是真还是假,如果是真则执行花括号里面的内容,如果假则不执行;
注 意:关键字后边的括号里的表达式是会被执行的,例如:如果你往里边放一个printf语句也会被执行并打印出来
if (printf("123"))//123 也会被打印出来
{
printf("22");
}
特 点:
1、如果“执行表语句”只有一条,那我们可以不加花括号
2、if语句里面可以嵌套自己
格式2:二必选一
if(表达式语句/条件)
{
//如果条件为真的表达式;
}
else
{
//如果条件为假的表达式语句
}
逻辑过程:会先来判断括号当中的表达式语句是真还是假,如果是真则执行if下面的花括号里面的内容,如果假则执行else下面的花括号的内容
注 意:每个else总是从属于与其最近的上一个if
多层嵌套范例
int a;
scanf("%d", &a);
if (a > 100)
{
printf("A\n");
}
else
{
if (a > 10)
{
printf("B\n");
}
else
{
if (a > 0)
{
printf("C\n");
}
}
}
上边这段代码等价于下边这段代码:
int a;
scanf("%d", &a);
if (a > 100)
{
printf("A\n");
}
else if(a > 10)
{
printf("B\n");
}
else(a > 0)
{
printf("C\n");
}
//一个容易犯的小思维误区:例如上边的例子里,现输入1000
//这时看起来是复合每一条判断语句的条件的,但,并不会执行每
//个判断语句下的内容;而是在第一条判断 if(a > 100) 处已经
//优先符合第一层条件,故马上执行第一个if下的内容printf("A\n");
//执行完后马上跳过其他if-else语句往下执行了
逻辑过程:从第一个条件往下判断,一旦某个条件为真就马上执行这个条件下的中括号里的语句,执行完后马上跳出if-else语句部分,往下继续执行其他内容;
switch:多路分支语句
常用书写格式:
switch(整型变量)//只能放整型变量作为标签,其余类型都不可!或者放枚举类型,因枚举也属于整型
{
case 值1: //值也只能是一个整型常量
执行语句;
break;
case 值2:
执行语句;
break;
case 最小值 ... 最大值://注意,这里的 ... 就是书写格式,例如:case:3 … 8 (表示3到8的区间)
执行语句;
break;
default:
执行语句;
break;
}
逻辑过程:判断switch括号中的"整型变量"的值是多少,然后从下面的case中找到有没有相等的值或区间,有则直接进入对应语句运行,没有则运行default里面的语句
注 意:
1、switch当中的小括号的内容必须得是一个整型数据(int、 long、 short、 char、 enum),不能够是浮点型或者字符串等非整型数据
2、default语句可以不加,default语句不管放在哪里都可以,但是所有的判断照旧,不会default的位置改变而改变
3、break:在这里面叫做跳出switch语句,如果没有遇到break语句,程序会按照顺序从入口一直执行到遇到break或者是switch语句结束。
int a;
scanf("%d", &a);//从键盘获取a的值
switch(a)
{
case 1: printf("A\n");
case 2: printf("B\n");
defauit: printf("E\n");
case 4: printf("C\n");
case 5 ... 10: printf("D\n");
}
如果是这样,在每个case里都没有添加break来进行Switch语句的跳出
这个代码是这样执行的:
1、它会进入到该代码块里然后从第一个case语句开始往下执行,
直到找到一个符合它的语句便会开始从这条语句开始往下执行,而且!
是执行所有剩余的case和default语句,不管判断符不符合剩余的case
和default的条件,就算遇到default也不会停下来,而是一直执行到
最后一条语句结束。
2、并且若是输入的数字没有任何一个case符合,它会识别到default语句
并一路往下执行,直到Switch结束。
goto:跳转语句
作用:从程序的某处调用goto可以跳过去标签所在地的代码中运行。
格式:
goto 标签;
标签名:
执行语句
例如:
printf("aaa");
goto A;
printf("bbb");
A:
printf("ccc");
执行结果:aaaccc,因为第二个打印语句已被goto语句跳过,不会被执行到
注意:
1,慎用goto(不要乱来),因为它会破坏C语言的面向过程性;
2,被其跳过的中间所有语句都不会被执行,,然后从标签处往下继续执行直到函数退出或者goto到别的地方
3,它只能在本函数之内执行,不能跳转到其他函数体里去;而汇编里的b指令可以往任何地方跳;
4,在C语言里,goto一般不往上跳转;
应用场景:
1、goto语句一般会直接跳转到函数的出口(一般都是出错处理),如下需马上跳出多个循环的情况:
int main(void)
{
whlie(a--)
{
while(b--)
{
while(c--)
{
if (出错判断)
{
goto err;//此时如果当前这个while(c--)循环里出错了,因为其外部还有两层循环
//不会马上把错误反馈出去,此时我们只要加一个goto语句进行条件判断
//若出现了对应的错误则马上跳出循环,跳到程序末尾结束程序并返回
//“代码出错”这个信息,如此提高了代码运行效率
}
}
}
}
return 0;//代码正常运行的返回
err:
return -1;//代码出错时的返回
}
(PS:这一个行业潜规则;因:若你使用了goto却不跳到函数出口return处,是会破坏C的面向过程性、打乱逻辑的)
2、在出错退出的时候定义一套动作,多个接口,例如下:执行多个错误反馈
int mian(void)
{
...
goto err1;
...
goto err2;
...
goto err3;
...
...
/*如此,在代码出现不同错误时会跳转到对应的出口处,进行不同出错反馈
这样能帮助我们及时发现错误*/
return 1;//程序正常运转的退出
err1:
return -1;//出错反馈1
err2:
return 0;//出错反馈2
err3:
return 2;//出错反馈3
}
二、循环控制:
While(表达式) —— 先判断再执行
格式:
while(判断表达式)
{
表达式;
}
逻辑过程:
1、先判断 “判断表达式” 是否为真,如果为真则执行花括号中“表达式”的内容,如果为假,则直接跳出循环往下执行;执行完“表达式”的内容后,会重新回去判断“判断表达式”是否成立;
2、重复 1 的过程:判断>>执行或退出循环>>判断>>执行或退出循环>>判断.........\
经典应用:死循环 while(1)
注意:
1、离开while循环的最后一个步是 while(判断表达式) 里的 “判断表达式” ;
2、同上边所说的if一样,while后边的括号里的语句也是会被执行的,例如往里边放一个printf语句,它也会打印出来;
do while —— 先执行再判断
格式:
do{
执行表达式;
}while(判断表达式);
逻辑过程:
先执行花括号里的“执行表达式”的内容,再回头判断“判断表达式”是否为真,如果为真则再次执行花括号中“执行表达式”的内容,如果为假,则直接跳出循环
for:—— 最优的循环体
格式:
for(初始化表达式; 判断表达式; 补充表达式)
{
执行语句;
}
逻辑过程:
1、一开始执行for会先执行“初始化表达式”,而且执行且只执行一次初始化表达式
2、接下来去判断"判断表达式"的内容是否为真,为真则开始执行“执行语句”,否则退出循环
3、当我们执行完“执行语句”,会先运行“补充表达式”的内容,再继续判断条件是否为真,如此循环
PS :
1、For( ;;) 等价于 while(1)
循环体的现实:首选for,其次while(1)
三、分支语句和循环语句的 搭配命令
break:
作用:立即跳出循环体往下执行;用于循环体或switch语句,一个break只能跳出一层循环;
逻辑过程:一旦遇到break直接跳出,不会拖泥带水,且离开循环体的最后一步就是break本身
continue(继续):
作用:只作用于循环体,跳过循环体内continue下面的语句,直接进入下一次循环
注意:程序离开循环体的最后一步是进行条件判断;