前言:C语言是结构化的程序设计语言,这里的结构指的是顺序结构、选择结构、循环结构。
我们可以将一般的项目拆分为这三种结构或者这三种结构的组合。
接下来将学习使用 if、switch 实现分支结构,使用for、while、do while 实现循环结构。
1.if语句
1.1.if
if 语句的语法形式如下:
表达式成立(为真),则语句执行;表达式不成立(为假),则语句不执行
在C语⾔中,0为假,⾮0表示真
1.2.else
对于任意一个整数,如果不是奇数,那就是偶数了,那这里就需要 if...else...语句了,语法形式如下:
1.3 分支中包含多条语句
默认在 if 和 else 语句中默认都只控制一条语句;如果是多条语句,就使用{}将多条语句包含。
比如:
1.4 嵌套if
在 if else 语句中,else 可以与另一个 if 语句连用,构成多重判断。
例:判断输入的数是正数,负数还是0
1.5 悬空else问题
如果有多个if和else,可以记住这样一条规则,else 总是跟最接近的 if 匹配。
例:
由例题思考:为什么是空白呢?
其实代码原意为:
所以,可以验证开头结论是正确的。
提醒:尽量在写代码时,习惯加上大括号。
2.关系操作符
C语言中用于比较的表达式称为“表达关系式”,里面使用的运算符就称为“关系表达式”,为“关系运算符”,主要有下面6个。
> 大于运算符
< 小于运算符
>= 大于等于运算符
<= 小于等于运算符
== 相等运算符
!= 不相等运算符
注意:1.相等运算符 ==与赋值运算符=是两个不一样的运算符,不要混淆。
例:
上面将b赋值为4,而4为非负数,即if语句永远为真,永远执行
2.多个关系运算符不宜连用。
例:
虽然上面代码不会报错,但是通常不会得到想要的结果,因为实际上关系运算符从左往右运算:
如果想要表达三者的连续关系,可以写成:
3.条件操作符
条件操作符也叫三目操作符,需要接受三个操作数的,形式如下:
条件操作符的计算逻辑是:如果 exp1 为真,exp2 计算,计算的结果是整个表达式的结果;如果exp1为假,exp3 计算,计算的结果是整个表达式的结果。
例子:《找出两个数中的最小值》
4.逻辑操作符:&&,||,!
逻辑运算符提供逻辑判断功能,用于构建复杂的表达式,主要为一下三个运算符。
! :逻辑取反运算符(改变单个表达式的真假)。
&& :逻辑与运算符,2就是并且的意思(两侧的表达式都为真,则为真,否则为假)。
|| :逻辑或运算符,就是或者的意思(两侧至少有一个表达式为真,则为真,否则为假)。
注:C语言中,非0表示真,0表示假
4.1 逻辑取反运算符!
假设变量a为假,且要求a为假时,进行语句执行,则可以:
4.2 逻辑与运算符&&
&&就是与运算符,也是并且的意思,
&&两边的表达&&是一个双目操作符,使用的方式是 a&&b,
两边式都是真的时候,整个表达式才为真,
只要有一个是假,则整个表达式为假。
4.3 逻辑或运算符||
||就是或运算符,也就是或者的意思,
是一个双目操作符,使用的方式是a||b,
||两边的表达式只要有一个是真,整个表达式就是真,
两边的表达式都为假的时候,才为假。
4.4 练习:闰年的判断
闰年判断的规则:
1.能被4整除并且不能被100整除是闰年
2.能被400整除是闰年
则:
4.5 短路
C语言逻辑运算符还有一个特点,它总是先对左侧的表达式求值,再对右边的表达式求值,这个顺序是保证的。
如果左边的表达式满足逻辑运算符的条件,就不再对右边的表达式求值。这种情况称为“短路”。
即:仅仅根据左操作数的结果就能知道整个表达式的结果,不再对右操作数进行计算的运算称为短路求值。
5.switch语句
除了 if 语句外,C语言还提供了 switch 语句来实现分支结构。
switch 语句是一种特殊形式的 if...else 结构,用于判断条件有多个结果的情况。
它把多重的 else if 改成更易用、可读性更好的形式。
上面代码中,根据表达式 expression 不同的值,执行相应的 case 分支,如果找不到对应的值,就执行 default 分支。
注:
switch 后的 expression 必须是整型表达式
case 后的值,必须是整形常量表达式
5.1 if语句和switch语句的对比
上述的代码中,需要注意:
1.case 和后边的数字之间必须有空格
2.每一个 case 语句中的代码执行完成后,需要加上 break ,才能跳出这个switch语句。
5.2 switch语句中的break
若不加break,则:
原因是: switch 语句也是分支效果的,只有在 switch 语句中使用 break 才能在跳出 switch 语句,如果某一个 case 语句的后边没有 break 语句,代码会继续往下执行,有可能执行其他 case语句中的代码,直到遇到 break 语句或者 switch 语句结束。就比如上面的代码就执行了 case1 中的语句。
当然,break 也不是每个case 语句都得有,例:
《输入一个1~7的数字为星期几,判断是否是工作日》
5.3 switch语句中的default
在使用 switch 语句的时候,我们经常可能遇到一种情况,比如 switch 后的表达式中的值无法匹配代码中的 case 语句的时候,这时候要不就不处理,要不就得在 switch 语句中加入default 子句。
例:
5.4 switch语句中的case和default的顺序问题
其实,在 switch 语句中 case 语句和 default 语句是没有顺序要求的,只要你的顺序是满足实际需求的就可以。
不过我们通常是把 default 子句放在最后处理的。
6.while循环
6.1 if 和while的对比
while 语句的语法结构和 if 语句非常相似。
6.2 while语句的执行流程
6.3 while 循环的实践
打印1~10:
7. for循环
7.1 语法形式
表达式1 用于循环变量的初始化
表达式2 用于循环结束条件的判断
表达式3 用于循环变量的调整
7.2 for循环的执行流程
首先执行表达式1 初始化循环变量,接下来就是执行 表达式2 的判断部分,
表达式2 的结果如果==0,则循环结束;
表达式2 的结果如果!=0,则执行循环语句,循环语句执行完后,再去执行表达式3 ,调整循环变量
然后再去表达式2 的地方执行判断,表达式2 的结果是否为0,决定循环是否继续。
7.3 for循环的实践
打印1~10:
7.4 while循环和for循环的对比
for 和 while 在实现循环的过程中都有初始化、判断、调整这三个部分,但是 for 循环的三个部分非常集中,便于代码的维护,而如果代码较多的时候 while 循环的三个部分就比较分散,所以从形式上 for循环要更优一些。
8. do-while循环
8.1 语法形式
while 和 for 这两种循环都是先判断,条件如果满足就进入循环,执行循环语句,如果不满足就跳出循环;
而 do while循环则是先直接进入循环体,执行循环语句,然后再执行 while 后的判断表达式,表达式为真,就会进行下一次,表达式为假,则不再继续循环。
8.2 do while循环的执行流程
8.3 do while循环的实例
打印1~10:
9.break和continue语句
在循环执行的过程中,可能需要提前终止循环。
C语言中提供了 break和 continue 两个关键字,就是应用到循环中的。
break 的作用是:用于永久的终止循环,只要 break 被执行,直接就会跳出循环,继续往后执行。
continue 的作用是:跳过本次循环中 continue 后边的代码,在 for 循环和 while 循环中有所差异的。
为什么两者有区别呢?
原因:前者,当a等于6后,就执行continue,直接跳过continue的代码,去循环的判断的地方//因 为这里跳过了a++,所以a一直为5,程序陷入和死循环
后者,continue跳过了后边的打印,来到了a++的调整部分
11.goto语句
C语言提供了一种非常特别的语法,就是 goto 语句和跳转标号, goto 语句可以实现在同一个函数
内跳转到设置好的标号处。
例:
goto 语句如果使用的不当,就会导致在函数内部随意乱跳转,打乱程序的执行流程,所以尽量不去使用;
但是 goto 语句也是有用的,在多层循环的代码中,如果想快速跳出,使用 goto 就非常的方便了。