分支与循环
1.C语言是结构化的程序设计语言,这里的结构指的是顺序结构,选择结构,循环结构。
2.分支结构:if,swich
循环语句:for,while,do while
3.if语句
if(表达式)
语句
表达式成立(为真),则语句执行,表达式不成立(为假),则语句不执行。
C语言中,零为假,非零为真。注意,表达式的结果如果是零,结果是不执行的,非零才执行。
ps:如果有多个if和else,可以记住这样一条规则,else总是和最近的if搭配。
4.常见问题:else悬空
因为else总是和最近的if匹配,当if…else被嵌套在一个大的if语句中时,大的if语句判断不成立,不会执行里面的if…else全部跳过,注意分清楚。else是和哪一个if匹配。
5.关系操作符(6种)
> 大于运算符
< 小于运算符
>= 大于等于运算符
<= 小于等于运算符
== 相等运算符
!= 不相等运算符
ps:关系操作符通常返回0或1表示真假
6.注意区分相等运算符和赋值操作符
相等运算符为两个等号==
赋值操作符为一个等号=
如果混淆,代码也能运行,但会有预料之外的结果,比如把判断相等的操作符写为赋值操作符,那么不管输入的数字是多少都会被赋值为新的数值。
为了防止这种错误,有些程序员在写代码判断相等时,会把数字写在左边,变量写在右边,如3==x,如果等号输少了,编译器会报错。
7.有一个非常容易犯的错误要注意:多个关系运算符不宜连用。
如:i<j<k连续使用两个小于运算符,这是合法表达,不会报错,但是通常达不到想要的结果,并不能保证j的值在i到k之间,关系运算符从左到右执行,实际上行使的是(i<j)<k,计算时i<j的返回值是0或1,所以最终是0或1与k进行比较,达不到我们的目的。
如果要实现i<j<k的判断,我们要使用下面的写法:i<j&&j<k
8.条件操作符(又叫三目操作符)
形式如:exp1?exp2:exp3其中exp1,exp2,exp3均为表达式,“?”和“:”才是三目操作符。
条件操作符是计算逻辑是:如果exp1为真,exp2计算,计算的结果是整个表达式的结果,如果exp1为假,exp3计算,计算的结果是整个表达式的结果。
9.逻辑操作符(逻辑运算的结果只有0和1)
C语言中0为假,非0为真。
!逻辑取反运算符或逻辑取非操作符,用于改变单个表达式的真假。(单目操作符)
&&与运算符,就是并且的意思,两侧表达式同真为真,有假则假。(双目操作符)
丨丨或运算,就是或者的意思,两侧表达式有真则真,全假才假。(双目操作符)
10.短路求值
指左边表达式满足逻辑运算符的条件,就不再对右侧的表达式求值。原因是C语言逻辑运算符的特点是总是先对左侧的表达式求值,再对右侧的表达式求值,这个顺序不变。
事实上,我们一般出现短路求值的情况有两种
一是在与运算中左侧表达式为假短路
二是在或运算中左侧表达式为真短路
根据左侧的表达式结果就能得出整个表达式的结果,0或1,真或假。
11.switch的分支语句
形式如下:
switch(expression){
case value1:statement
case value2:statement
default:statement
}
注意:switch后面的expression必须是整形表达式
case后的值,必须是整形常量表达式
case和后面的数字时间必须有空格
每一个case语句中的代码执行完后,需要加上break,才能跳出这个swich语句。如果没有break,会执行下一个case。
根据表达式exprssion不同的值,执行相应的case分支,如果找不到对应的值,就执行default分支。
在switch语句中,case语句和default语句是没有顺序要求的,能满足要求即可,不过我们一般把default语句放在最后。
switch语句有两层,里层的break只能跳出自己的循环,不能跳出外面的循环。
12.循环语句while
while(表达式)
语句;
表达式非零执行循环,语句执行完后再判断,是否进行下一次循环,为零不执行循环。
13.循环语句for
for(表达式1;表达式2;表达式3)
表达式1用于循环变量的初始化
表达式2用于循环结束条件的判断
表达式3用于循环变量的调整(就是怎么变)
执行流程:表达式1初始化,表达式2判断,执行循环体,表达式3,表达式2判断,执行循环体,表达式3……
ps:在for循环的第三个表达式 即循环变量的调整部分i++和++i在效果上没有区别,C语言中不存在++i比i++高级的说法。C++语言中,内置类型上也不存在,自定义类型确实++i的效率高于i++
14.循环语句do……while语句
do
语句;
while(表达式);
while和for这两种循环都是先判断,条件如果满足就进入循环,执行循环语句,如果不满足就跳出循。而do…while循环是先直接进入循环体,执行循环语句,然后再执行while后的判断表达,表达式为真就会进行下一次循环,表达式为假就不再循环。
ps:在do…while循环中,循环体至少是执行一次的。是do…while比较特殊的一点。
15.break语句和continue语句
break语句:永久的终止循环,只要break被执行,直接就会跳出循环,继续往后执行。
continue语句:跳过本次循环continue后面的代码,在for循环和while循环中是存在差异的。
在while语句中,continue会跳过continue后面的代码回到while循环的判断表达式,这时如果循环的调整是在continue后面也会被跳过,从而导致输入的数字恒为某一值。程序进入死循环。do…whike中的continue和while语句中的continue用法几乎一模一样。
在for语句中,continue会跳过本次循环中continue后面的代码,直接去到循环的调整部分,即for循环的表达式3。
16.goto语句
C语言提供了一种非常特别的语法,就是goto语句和跳转标号,goto语句可以实现在同一个函数内跳转到设置好的标号处。
如:
#include<stdio.h>
int main()
{
printf("hehe\n");
goto next;
printf("haha\n");
next:
printf("跳过了haha的打印\n”);
retutn 0;
}
跳转标号使用时后面加冒号。
goto语句如果使用不当,就会在函数内部随意乱跳转,不建议使用。但是在多层循环嵌套的代码中,使用go to语句能快速跳出,非常方便。如下:
for(…)
{
for(…){
for(…){
if(disaster)
goto error;
}
}
}
error:
……