C语⾔是结构化的程序设计语⾔,这里的结构是指顺序结构、选择结构(分支结构)以及循环结构,C语言是可以实现这些结构的。其实我们不难发现,我们平时的生活基本上就是由这三种结构组成。
在C语言中,分支结构可由 if 语句和switch 语句实现,而循环结构可由 for语句、while语句和do...while语句实现。
1.分支语句
1.1 if...else语句
1.1.1 if
如果你想要你的代码只打印一种情况,那么只需要使用 if 语句就行了。
if语句的表达形式如下:
如果表达式成立(为真),则语句执行;如果表达式不成立(为假),则语句不执行。
在C语言中规定:非0表示真;0表示假。
示例:
输⼊⼀个整数,判断是否为奇数
1.1.2 else
如果你想打印第一种情况和与第一种相反的情况,那么 这个时候就需要if...else语句了。
语句形式如下:
示例:
输⼊⼀个年龄,>= 18岁就输出:成年,否则就输出:未成年
1.1.3分支中包含多条语句
在C语言中默认 if 和 else 语句都只是控制一条语句。比如:
通过上面的代码,你会发现输入的值不管是>=18 还是小于18,"可以交女朋友了" 都会打印在屏幕上。
这是因为
if
语句只能控制⼀条语句,就是
printf("
成年了
\n");
if语句为真,则打印成年了,
if语句为假,则不打印,对于
printf("
可以谈恋爱了
\n");
是独⽴存在的,不管if语句的条件的真
假,都会被执行
。
但是,如果我们想要 if 语句控制多条语句,那就要使用
{}
将代码括起来, else 后也可以跟上⼤括号。如下:
1.1.4 嵌套 if
在
if... else
语句中,
else
可以与另⼀个
if
语句连用,在我们需要构成多重判断时使用。
比如:要求输⼊⼀个整数,判断输⼊的整数是0,还是正数或者负数。
以上就是嵌套if语句的语法,有了嵌套if语句,就可以完成更多复杂逻辑的判断。
1.1.5悬空else问题
在C语言中规定:else
总是跟最接近的
if
匹配。
比如:
上面这个代码什么都不会打印出来,因为
上⾯的代码排版,让
else
和第⼀个
if
语句对齐,让我们以为
else
是和第⼀个if匹配的,当
if
语句不成立的时候,自然想到的就是执行
else 子
句,打印
haha
,但实际上
else
是和第⼆个
if
进行匹配的,这样后边的
if...else
语句是嵌套在第⼀个
if
语句中的,如果第⼀个
if
语句就不
成⽴,嵌套
if
和
else
就没机会执行了,最终啥都不打印。
但是如果将代码改成下面这样就容易读懂了。
只要带上适当的⼤括号,代码的逻辑就会更加的清晰,所以我们以后在写代码的时候要注意括号的使用。让代码的可读性更高。
1.2 switch 语句
switch 语句是⼀种特殊形式的 if...else 结构,用于判断条件有多个结果的情况。它把多重的 else if 改成更易用、可读性更好的形式。
上面代码中,根据表达式
expression
不同的值,执行相应的
case
分支,然后通过break语句跳出循环;如果找不到对应的值,就执行default
分支。
注意:
• switch 后的 expression 必须是整型表达式
• case 后的值,必须是整形常量表达式
1.2.1 switch中的break语句
break语句会在相应的case分支执行后,跳出switch循环;但是如果我们把case语句中的break去掉,会发生什么样的情况?
我们来创建一个代码:输⼊任意⼀个整数值,计算除3之后的余数
运行结果为:
为什么会出现这种情况呢?
这是因为
switch
语句也是分支效果的,只有在
switch
语句中使用
break
才能在跳出
switch
语
句,如果某⼀个
case
语句的后边没有
break
语句,代码会继续玩下执行,有可能执行其他
case
语句中的代码,直到遇到
break
语句或者
switch
语句结束。就比如上面的代码就执行了
case
2 中的语句。所以在
switch
语句中
break
语句是非常重要的,能实现真正的分⽀效果。
1.2.2 switch中的default语句
在使用switch语句时,我们通常会遇到这样一个情况,就是switch中的表达式中的值无法匹配到case分支。这时候要不就不做处理,要不就得在 switch 语句中加入default子句。
1.2.3switch中的break和default的顺序问题
在
switch
语句中
case
语句和
default
语句是没有顺序要求的,只要你的顺序是满⾜实
际需求的就可以。
不过我们通常是把
default
⼦句放在最后处理的。
2.循环语句
2.1 while循环
while语句的语法结构与if语句非常相似,不过while语句可以实现循环效果。
2.1.1while的语法形式
2.1.2 while的执行流程
首先计算圆括号中表达式的值,如果值非0,则执行循环体语句,接着判定表达式。这个过程持续到表达式的值为0才结束。
2.1.3while的实践
在屏幕上打印1~10的数字
2.2 for循环
2.2.1 for循环的语法形式
表达式 1:循环开始前的初始化步骤,只执行一次。
表达式 2:循环的条件,决定循环的继续或结束。
表达式 3:每次循环中最后一个被执行的操作。设置循环的步长,改变循环变量的值,从而可改变表达式2的真假性。
2.2.2 for语句的执行流程
首先执行表达式
1
初始化循环变量,接下来就是执行 表达式
2
的判断部分, 表达式
2
的结果如果
==0,则循环结束; 表达式
2
的结果如果!=0则执行循环语句,循环语句执行完后,再去执行表达式 3 ,调整循环变量,然后再去表达式
2
的地方执行判断, 表达式
2
的结果是否为0,决定循环是否继续。整个循环的过程中,表达式1初始化部分只被执行1次,剩下的就是表达式2、循环语句、表达式3在循环。
2.2.3 for语句的实践
在屏幕上打印1~10的数字
2.2.4 while循环与for循环的比较
’
由上面两个图可知while语句中的初始化、判断和调整不在同一位置,如果代码过多出现bug时,可能找不到并改正它们。而for语句中这三个在同一位置,出现bug时,易找到并改正。所以循环语句中for语句比while语句使用率高。
2.3 do...while循环
2.3.1 do..while的语法形式
2.3.2 do...while的执行流程
在
do while
循环中先执行图上的“语句”,执行完语句,在去执行“判断表达式”,判断表达式的
结果是!=0,则继续循环,执行循环语句;判断表达式的结果==0,则循环结束。
所以在
do while
语句中循环体是至少执行⼀次的,这是
do while
循环比较特殊的地⽅。
2.3.3 do...while的实践
打印1~10的数字
⼀般
do while
使⽤在循环体至少被执行⼀次的场景下,所以较少⼀些。
2.4break语句与continue语句
在执行循环过程中,总是会遇到突发情况使循环中断。C语言提供了break语句和continue语句来表达这种情况。
2.4.1 break语句
break语句能够强制结束循环,转到后续语句执行。示例如下:
2.4.2 continue语句
continue语句能够中断循环体的本次执行(即跳过循环体中尚未执行的语句),立即开始新的一轮循环。示例如下:
2.5 goto语句
C语言提供了⼀种非常特别的语法,就是
goto
语句和跳转标号,
goto 语句可以实现在同⼀个函数内跳转到设置好的标号处。但是goto语句也可能跳过了某些对象的构造、变量的初始化、重要的计算等语句,造成代码错误。
它能从多重循环体中咻地一下子跳到外面,用不着写很多次的 break 语句; 例如
就象楼房着火了,来不及从楼梯一级一级往下走,可从窗口跳出火坑。所以我们主
张少用、慎用 goto 语句。