【C语言】分支语句和循环语句(优化版)

前言

本篇写的内容是C语言中的分支和循环语句。
分支语句ifelse语句、switch语句
循环语句while循环、for循环、do while循环

语句

C语言中由一个分号;隔开的就是一条语句。C语句可分为五类,表达式语句、函数调用语句、控制语句、复合语句和空语句。比如:
在这里插入图片描述

控制语句用于控制程序的执行流程,以实现程序的各种结构方式,它们由特定的语句定义符组成。

分支语句

ifelse语句

if语句的语法结构是:

if (表达式)
        语句 ;
 >//单分支
if (表达式)
  语句 1;
else
     语句2 ;
>**//多分支**
if (表达式1)
      语句 1;
else if (表达式2)
     语句2 ;
else
      语句3 ;

注:在C语言中非0就是真,if后面圆括号中的表达式是非0,语句就能执行

:如下图一,创建一个age变量,当我令age=10时,if语句后面的表达式不成立,也就是假,所以不执行。当我令age=20时,如下图二,打印成年。

图一

请添加图片描述
图二
请添加图片描述

图三
请添加图片描述

现在在else后面再加上一条,如果是未成年,不能谈恋爱。 注意,当if或者else后面默认只能控制一条语句,所以这里要执行两条语句就要加上大括号
在这里插入图片描述
​​

多分支语句结构例:
如下图一,令18-26岁之间的为青年,可以看到当我让age=40时,不在区间内却还是打印了青年。这个代码语法上没有错误,但是逻辑上有误。age=40时,if表达式中的age=40,然后18<=40,所以;条件成立,成立为真,就是1,然后18<=age就为1,而后1<26,所以条件成立,又是1,所以这个地方会打印青年。 正确的方式是age >= 18 && age < 26 ;或者不写age >= 18。

图一
在这里插入图片描述

图二
在这里插入图片描述

switch语句

swith语句也是一种分支语句,常常用于多分支的情况。

swith语句的语法结构是:

switch(整形表达式)

{

语句项;

}

语句项是什么呢?
是一些case语句:

case 整型常量表达式:
              语句;

例:输入1-7的数字,分别代表对应的星期。那用ifelse语句会比较麻烦,那我们就得有不一样的语法格式,这里运用的就是swith语句。

如下图一,运用switch语句写出,可以看到当我输入1的时候,输出了星期一,但是也继续输出到星期天的值。是因为case 1语句执行完,没有阻止语句停下来,语句会一直执行,直到把case语句执行完。当输入2,是什么结果。结果如下图2,可以看到当输入2的时候,语句从case 2进去,跳过case 1。switch后面的表达式结果是几,就会从case 几进去。

那我们要达到分支的结果,就必须有入口和出口,case决定入口,那出口,我们可以加上break,break叫跳出,停止。那我们在每一个case后面加上break,看看效果是什么。可以看到图三,当我输入1,结果就是星期一。

图一
在这里插入图片描述

图二
在这里插入图片描述

图三
在这里插入图片描述

case后面的break不是必须要加的,按题目的需求来加。break语句的实际效果是把语句划分成不同的部分。

例:现在输入1-5是工作日,6-7是休息日。在这里插入图片描述

default子句

当表达的值与所有的case标签的值都不匹配。所有的语句都被跳过,程序结果不会报错,但是,不想忽略不匹配所有标签的表达式的值时,我们可以增加一条default子句。
default子句可以放在switch语句中的任意位置 。但默认在所有case语句之后。

循环语句

while循环

while语句语法结构

whlie(表达式)

      循环语句;

比如我们实现:在屏幕上打印1-10的数字。
在这里插入图片描述

如下图是while语句的执行流程图在这里插入图片描述

菱形的语句是判断语句,可以看到当判断结果为0时,0为假,循环结束。当判断结果为非0,就跳到循环语句stmt中,语句执行完再回到判断语句中,再判断,如果非0再执行…而在循环语句执行中可能会遇到break和continue,我们来看一下。

while语句中break关键字的作用

举个例子:令i==5时,break,看看打印结果。屏幕上打印了1-4的数字,按f10调试,可以看到当i=5时,到break以后直接跳出了循环,就不会打印5。
可见在while循环中,break用于永久的终止循环。
在这里插入图片描述

while语句中continue关键字的作用

我们把上面的break换成continue,看看打印结果。屏幕上打印了1-4打印后,后面进入死循环,按f10调试代码,当i=5进入while循环中,经过continue,然后有直接进到while的判断部分。而后重新进入循环,又经过continue,又直接回到判断部分…
可以得出在while循环中,continue的作用是跳过本次循环continue后面的代码,直接去判断部分,看是否进入下次循环。
在这里插入图片描述

我们现在来看下面这串代码:
在这里插入图片描述

在这之前我们来了解getchar是如何使用的,首先getchar是获取一个字符的意思,打开MSDN搜索getchar 函数,如下图的意思是读取一个字符从一个流里面或者从一个stdin里面获取。stdin叫标准输入指的是从键盘获取字符。可以看到getchar的返回类型是int类型。如下图二,getchar返回的值是一个字符的ASCLL码值,如果遇到读取错误或者文件结束,则返回EOF。EOF的定义如下图三,EOF就是-1。EOF 就是 end of file文件结束的标志。

图一
在这里插入图片描述

图二
在这里插入图片描述

图三
在这里插入图片描述

这串的代码意思就是不断地在屏幕上读取字符。按ctrl+z, getchar读取结束。在这里插入图片描述

这段代码怎么应用呢?

我们来写一段场景。
如下图一,我们可以看到屏幕上当我输入密码之后,直接返回了确认失败。这是因为getchar读取了回车键,相当于读取了一个\n。
像getchar,scanf这样的输入函数读取信息不是直接在键盘上获取信息,而是在函数与键盘之间的缓冲区中读取数据,像上面的例子,我输入了一个’a’字符,然后回车就相当于把字符a和\n放入缓冲区。所以在我输入字符a,在读取下一个字符时就换行了。

现在我们来看到下面这串代码,当我输入密码123456时回车还输入了\n,所以在缓冲区中有123456\n,而\n会触发scaanf函数读取信息,屏幕上打印了123456,缓冲区还剩\n。接着屏幕上确认密码,再下一步,按道理来说需要getchar等待输入Y\N,但是没有等待输入getchar,是因为缓冲区有\n,getchar直接获取了\n,放到ch里边。

那要怎么解决缓冲区\n这个问题,这个时候需要做一件事就是清理缓冲区。

getchar用于获取缓冲区的数据,那我们可以在getchar之前再写一个getchar把缓冲区的\n拿走。如下图二所示。

图一
在这里插入图片描述
图二
在这里插入图片描述

但是如果我输入的是123456空格abc这种情况,可以看到如下图一,没有输入Y/N直接确认失败,是因为这个时候的缓冲区有abc\n多个字符,scanf函数会把123456拿走读取,而缓冲区还有多个字符,getchar()只能读取一个字符,这个时候就需要用到循环语句来解决缓冲区的多个字符问题。

图一
在这里插入图片描述
图二
在这里插入图片描述

可以看到写的处理缓冲区的多个字符问题的while循环是不是很像读取字符的那串代码,只不过没有加上返回的值。这就是这串代码可能会出现的场景。

for循环

for循环的语法结构:

for(表达式1;表达式2;表达式3)

        循环语句;

表达式1为初始化部分,用于初始化循环变量的。表达式2为条件判断部分,用于判断循环循环时候终止。表达式3为调整部分,用于循环条件的调整。在for循环中初始化只执行一次。

例:在屏幕上打印1-10的数字
在这里插入图片描述

在for循环执行的过程中,也会遇到break和continue,我们来分析一下break和continue在for循环中的作用。

for语句中break关键字的作用

还是在屏幕上打印1-10的数字,当令i==5时,break。看到屏幕上和while一样也是打印1-4的数字。在这里插入图片描述

说明在for语句中,break用于永久的终止循环。

for语句中continue关键字的作用

我们把上面的break换成continue,看看打印结果,结果为1-10,跳过5。和while循环的结果不一样,是因为,在while循环中,continue把后面i++跳过了,而for循环跳过后面的打印5的代码,重新回到for循环中,没有跳过i++。

for循环中,continue的作用也是跳过本次循环continue后面的代码,直接去判断部分,看是否进入下次循环。
在这里插入图片描述

建议:
1.不可在for循环体内修改循环变量,防止for循环失去控制。
2.建议for语句的循环控制变量的取值采用"前闭后开区间"写法

一些变种的for循环

变种1.for循环中表达式全省略

判断部分的省略 -->判断部分恒为真 – >死循环,所以在for语句中还是建议不要省略。
在这里插入图片描述

例:屏幕上打印了9个haha,外循环3次,内循环3次,相乘9次。在这里插入图片描述

那我们取消初始化,看看打印几个。可以看到,打印3个,这是因为j没有初始化了,在第一次 i=0进去以后,j循环3次 j=3,而后i=1时,不会再进到 j 的for循环当中。
在这里插入图片描述

变种2:两个变量同时控制一个语句
在这里插入图片描述

do()while循环

do语句的语法结构:

 do

         循环语句;

   while(表达式);

do…while()和while语句的区别是while先判断后执行,do…while()是先执行后判断。注意,do带的循环语句可以是一段代码。

例:在屏幕上打印1-10的数字
在这里插入图片描述

do语句的执行流程:
首先直接进入循环语句再进入判断语句,而在执行语句过程中,也会遇到break和continue。
在这里插入图片描述

do语句中的break和continue关键字

图一
在这里插入图片描述

图二
在这里插入图片描述

do语句的特点:
循环至少执行一次,使用的场景有限,所以不是经常使用。

以上就是C语言分支和循环语句的所有内容,下节就是关于分支语句和循环语句的例题讲解,感谢观看!

  • 25
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 64
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 64
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值