【C语言】分支语句与循环语句

【C语言】分支语句与循环语句,第1张

前言

本篇写的内容是C语言中的分支和循环语句。


分支语句ifelse语句、switch语句

循环语句while循环、for循环、do while循环

语句

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(表达式1;表达式2;表达式3)

        循环语句;

表达式1为初始化部分,用于初始化循环变量的。


表达式2为条件判断部分,用于判断循环循环时候终止。


表达式3为调整部分,用于循环条件的调整。


在for循环中初始化只执行一次。


例:在屏幕上打印1-10的数字

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


while语句中break关键字的作用

还是在屏幕上打印1-10的数字,当令i==5时,break。


看到屏幕上和while一样也是打印1-4的数字。


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


while语句中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语句的特点:

循环至少执行一次,使用的场景有限,所以不是经常使用。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/562400.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-01
下一篇 2022-04-01

发表评论

登录后才能评论

评论列表(0条)

保存