C语言分支和循环语句

C语⾔是结构化的程序设计语⾔,这⾥的结构指的是顺序结构、选择结构、循环结构,C语⾔是能够实现这三种结构的,其实我们如果仔细分析,我们⽇常所⻅的事情都可以拆分为这三种结构或者这三种 结构的组合。
我们可以使⽤ if switch 实现分⽀结构,使⽤ for while do while 实现循环结构。

1.分支结构

1.1 if语句

if 语句的语法形式如下:

if ( 表达式 )

      语句

表达式成⽴(为真),则语句执⾏,表达式不成⽴(为假),则语句不执⾏。

在C语⾔中, 0 ⾮0表示真,也就是表达式的结果如果是0,则语句不执⾏,表达式的结果如果不 是0,则语句执⾏。
例子:输入一个整数,判断是否为偶数。
当我们运行代码,尝试随便输入一个33结果为:

1.1.1 else

if 语句加else的语法形式如下:

if ( 表达式 )
      语句1
else
      语句2
当表达式成立执行语句1 , 当表达式不成立时执行语句2。
例子:输⼊⼀个年龄, >= 18岁就输出:成年,否则就输出:未成年。
当我们尝试输入19,结果为:

1.1.2 分支中包含多条语句

默认在 if 和 else 语句中默认都只控制⼀条语句,⽐如:
经过代码运行测试发现无论输入年龄是否大于等于18,输出的结果都包含“可以谈恋爱了”
这是因为 if 语句只能控制⼀条语句,就是 printf("成年了\n"); ,if语句为真,则打印成年了,
if语句为假,则不打印,对于 printf("可以谈恋爱了\n"); 是独⽴存在的,不管if语句的条件的真
假,都会被执⾏。那如果我们要if语句同时控制2条语句,怎么办呢?那就要使⽤{} 将代码括起来,
else 后也可以跟上⼤括号。如下:

1.1.3 嵌套if

 在 if else 语句中, else 可以与另⼀个 if 语句连⽤,构成多重判断。

⽐如:要求输⼊⼀个整数,判断输⼊的整数是0,还是正数或者负数。请看如下代码:
上图中蓝色背景的代码就是嵌套在前⾯的 else ⼦句中的,构成了嵌套的if语句。
再⽐如:输⼊⼀个整数,如果是正数,再判断是奇数还是偶数,并输出;如果不是正数则输出:非正数。
上⾯的代码中蓝色背景的代码也是嵌套在 if 语句中的,构成了嵌套的 if 语句。
以上就是嵌套if语句的语法,有了嵌套if语句,就可以完成更多复杂逻辑的判断。

1.1.4 悬空else问题

如果有多个 if else ,可以记住这样⼀条规则, else 总是跟最接近的 if 匹配
例如:
运行结果是什么呢?
很多初学者,上来以判断 a 是 0,不等于 1 ,那就执⾏ else ⼦句,打印 haha
但是当你去运⾏代码,输出的结果是:啥都不输出。
为什么呢?
这就是悬空 else 的问题,如果有多个 if 和 else ,可以记住这样⼀条规则, else 总是跟最接近
的 if 匹配。上⾯的代码排版,让 else 和第⼀个 if 语句对⻬,让我们以为 else 是和第⼀个if匹配的,当 if语句不成⽴的时候,⾃然想到的就是执⾏ else ⼦句,打印 haha ,但实际上 else 是和第⼆个 if进⾏匹配的,这样后边的 if...else 语句是嵌套在第⼀个 if 语句中的,如果第⼀个 if 语句就不
成⽴,嵌套 if 和 else 就没机会执⾏了,最终啥都不打印。
如果代码改成下⾯这样就更加容易理解了
因此只要带上适当的⼤括号,代码的逻辑就会更加的清晰,所以⼤家以后在写代码的时候要注意括号的使用,让代码的可读性更⾼。

1.2switch语句

除了 if 语句外,C语⾔还提供了 switch 语句来实现分⽀结构。
switch 语句是⼀种特殊形式的 if...else 结构,⽤于判断条件有多个结果的情况。它把多重
的 else if 改成更易⽤、可读性更好的形式。

switch (expression) {
case value1: statement
case value2: statement
default: statement
}

上⾯代码中,根据表达式 expression 不同的值,执行相应的 case 分⽀。如果找不到对应的值,就执行default 分⽀。
注:
switch 后的 expression 必须是整型表达式
case 后的值,必须是整形常量表达式

1.2.1 if语句和switch语句的对比

同一个问题可用if语句或者switch语句实现

例如:输⼊任意⼀个整数值,计算除3之后的余数

用if语句如下:

用switch语句如下:

上述的代码中,我们要注意的点有:
1. case 和后边的数字之间必须有空格
2. 每⼀个 case 语句中的代码执⾏完成后,需要加上 break ,才能跳出这个switch语句。

1.2.2 switch语句中的break

前面的代码中,如果我们去掉case语句中的break,会出现什么情况呢?、
测试一组数据看看结果:
我们发现,7除以3本来余数是1,但是我们发现程序运⾏的结果多了⼀行“余数是2”的打印。
这是为什么呢?
原因是 switch 语句也是分支效果的,只有在 switch 语句中使⽤ break 才能在跳出 switch 语 句,如果某⼀个 case 语句的后边没有 break 语句,代码会继续往下执⾏,有可能执行其他 case 语句中的代码,直到遇到 break 语句或者 switch 语句结束。就比如上面的代码就执行了 case2 中的语句。这个叫做case穿透
所以在 switch 语句中 break 语句是非常重要的,能实现真正的分支效果。
当然, break 也不是每个 case 语句都得有,这就得根据实际情况来看了。

1.2.3 switch语句中的default

在使⽤ switch 语句的时候,我们经常可能遇到⼀种情况,⽐如 switch 后的表达式中的值⽆法匹
配代码中的 case 语句的时候,这时候要不就不做处理,要不就得在 switch 语句中加入default ⼦句。

switch (expression) {
case value1: statement
case value2: statement
default : statement
}

switch 后边的 expression 的结果不是 value1 ,也不是 value2 的时候,就会执行default ⼦句。

1.2.4 switch语句中的case和default的顺序问题

在 switch 语句中 case ⼦句和 default ⼦句有要求顺序吗? default 只能放在最后吗?
其实,在 switch 语句中 case 语句和 default 语句是没有顺序要求的,只要你的顺序是满足实
际需求的就可以。
不过我们通常是把 default ⼦句放在最后处理的。

2.循环结构

2.1while循环

C语⾔提供了3种循环语句, while 就是其中⼀种,接下来就介绍⼀下 while 语句。

2.1.1 if 和 while的对⽐

while 语句的语法结构和 if 语句非常相似。

if ( 表达式 )
    语句 ;
         
while ( 表达式 )
     语句 ;   // 如果循环体想包含更多的语句,可以加上⼤括号

这就是他们的区别,while语句是可以实现循环效果的。

2.1.2 while语句的执行流程

⾸先上来就是执行判断表达式,表达式的值为0,循环直接结束;表达式的值不为0,则执行循环语
句,语句执行完后再继续判断,是否进行下⼀次判断。

2.1.3 while 循环的实践

例子:在屏幕上打印 1~10 的值

2.2 for循环

for 循环是三种循环中使⽤最多的, for 循环的语法形式如下:

for(表达式1; 表达式2; 表达式3)
       语句; // 如果循环体想包含更多的语句,可以加上⼤括号
表达式1: 用于循环变量的初始化
表达式2: 用于循环结束条件的判断
表达式3: 用于循环变量的调整

2.2.1 for循环的执行流程

⾸先执⾏ 表达式 1 初始化循环变量,接下来就是执行表达式 2 的判断部分, 表达式 2 的结果如果
==0,则循环结束; 表达式 2 的结果如果!=0则执行循环语句,循环语句执⾏行完后,再去执行表 达式 3 ,调整循环变量,然后再去 表达式 2 的地方执行判断, 表达式 2 的结果是否为0,决定循环是否继续。
整个循环的过程中,表达式1初始化部分只被执行1次,剩下的就是表达式2、循环语句、表达式3在循环。

2.2.2 for循环的实践

例子:在屏幕上打印 1~10 的值

2.2.3 while循环和for循环的对比

for while 在实现循环的过程中都有初始化、判断、调整这三个部分,但是 for 循环的三个部
分非常集中,便于代码的维护,而如果代码较多的时候 while 循环的三个部分就⽐较分散,所以从形式上 for 循环要更优⼀些。

2.3 do-while 循环

在循环语句中 do while 语句的使用最少,它的语法如下:
do
     语句;
while(表达式)
while for 这两种循环都是先判断,条件如果满⾜就进⼊循环,执行循环语句,如果不满足就跳
出循环;
do while 循环则是先直接进⼊循环体,执行循环语句,然后再执行  while 后的判断表达式,表
达式为真,就会进行下⼀次,表达式为假,则不再继续循环。

2.3.1 do while循环的执行流程

在 do while 循环中先执行图上的“语句”,执行完语句,在去执行“判断表达式”,判断表达式的
结果是!=0,则继续循环,执行循环语句;判断表达式的结果==0,则循环结束。
所以在 do while 语句中循环体是至少执行⼀次的,这是 do while 循环比较特殊的地方。

2.3.2 do while循环的实践

例子:在屏幕上打印 1~10 的值

⼀般 do while 使⽤在循环体⾄少被执⾏⼀次的场景下,所以较少⼀些。

2.3.3 do while循环中的break和continue

do.while 语句中的 break continue 的作用和 while 循环中几乎⼀模⼀样,⼤家下来可以自行测试并体会。

2.4 循环的嵌套

前⾯学习了三种循环 while do while for ,这三种循环往往会嵌套在⼀起才能更好的解决
问题,就是我们所说的:循环嵌套,这⾥我们就看⼀个例子。
例子:
找出100~200之间的素数,并打印在屏幕上。
注:素数⼜称质数,只能被1和本⾝整除的数字。

2.5 goto语句

C语⾔提供了⼀种非常特别的语法,就是 goto 语句和跳转标号, goto 语句可以实现在同⼀个函数
内跳转到设置好的标号处。
goto 语句如果使用的不当,就会导致在函数内部随意乱跳转,打乱程序的执行流程,所以我们的建议是能不用尽量不去使用;但是 goto 语句也不是⼀无是处,在多层循环的代码中,如果想快速跳出使用goto 就非常的方便了。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值