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

前言

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

分支语句ifelse语句、switch语句

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

语句

C语言中由一个分号;隔开的就是一条语句。比如:【C语言】分支语句与循环语句_第1张图片

分支语句

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时,如下图二,打印成年。

图一

【C语言】分支语句与循环语句_第2张图片

图二 

 【C语言】分支语句与循环语句_第3张图片

 图三【C语言】分支语句与循环语句_第4张图片

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

【C语言】分支语句与循环语句_第5张图片

多分支语句结构例:

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

图一

【C语言】分支语句与循环语句_第6张图片

图二

【C语言】分支语句与循环语句_第7张图片

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,结果就是星期一。

图一

【C语言】分支语句与循环语句_第8张图片

图二

【C语言】分支语句与循环语句_第9张图片

图三

【C语言】分支语句与循环语句_第10张图片

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

例:现在输入1-5是工作日,6-7是休息日。

【C语言】分支语句与循环语句_第11张图片

default子句

当表达的值与所有的case标签的值都不匹配。所有的语句都被跳过,程序结果不会报错,但是,不想忽略不匹配所有标签的表达式的值时,我们可以增加一条default子句。

default子句可以放在switch语句中的任意位置 。但默认在所有case语句之后。

【C语言】分支语句与循环语句_第12张图片

循环语句

while循环

while语句语法结构:

    whlie(表达式)

          循环语句;

比如我们实现:在屏幕上打印1-10的数字。

【C语言】分支语句与循环语句_第13张图片

如下图是while语句的执行流程图

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

【C语言】分支语句与循环语句_第14张图片

while语句中的break关键字作用

举个例子:令i==5时,break,看看打印结果。屏幕上打印了1-4的数字,按f10调试,可以看到当i=5时,到break以后直接跳出了循环,就不会打印5。

可见在while循环中,break用于永久的终止循环。

【C语言】分支语句与循环语句_第15张图片

while语句中continue关键字的作用

我们把上面的break换成continue,看看打印结果。屏幕上打印了1-4打印后,后面进入死循环,按f10调试代码,当i=5进入while循环中,经过continue,然后有直接进到while的判断部分。而后重新进入循环,又经过continue,又直接回到判断部分...

可以得出在while循环中,continue的作用是跳过本次循环continue后面的代码,直接去判断部分,看是否进入下次循环。

【C语言】分支语句与循环语句_第16张图片

我们现在来看下面这串代码:

【C语言】分支语句与循环语句_第17张图片

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

图一

【C语言】分支语句与循环语句_第18张图片

图二 

图三

【C语言】分支语句与循环语句_第19张图片

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

【C语言】分支语句与循环语句_第20张图片

这段代码怎么应用呢?

我们来写一段场景。

如下图一,我们可以看到屏幕上当我输入密码之后,直接返回了确认失败。这是因为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拿走。如下图二所示。

图一

【C语言】分支语句与循环语句_第21张图片

 图二【C语言】分支语句与循环语句_第22张图片

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

【C语言】分支语句与循环语句_第23张图片

图二 

 【C语言】分支语句与循环语句_第24张图片

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

for循环

语法结构:

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

        循环语句;

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

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

【C语言】分支语句与循环语句_第25张图片

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

while语句中break关键字的作用

还是在屏幕上打印1-10的数字,当令i==5时,break。看到屏幕上和while一样也是打印1-4的数字。

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

【C语言】分支语句与循环语句_第26张图片

while语句中continue关键字的作用

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

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

【C语言】分支语句与循环语句_第27张图片

建议:

1.不可在for循环体内修改循环变量,防止for循环失去控制。

2.建议for语句的循环控制变量的取值采用"前闭后开区间"写法

一些变种的for循环

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

判断部分的省略 - 判断部分恒为真 - 死循环,所以在for语句中还是建议不要省略。

【C语言】分支语句与循环语句_第28张图片

例:屏幕上打印了9个haha,外循环3次,内循环3次,相乘9次。

【C语言】分支语句与循环语句_第29张图片

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

 【C语言】分支语句与循环语句_第30张图片

变种2:两个变量同时控制一个语句

【C语言】分支语句与循环语句_第31张图片

do while()循环

do语句的语法:

   do

         循环语句;

   while(表达式);

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

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

【C语言】分支语句与循环语句_第32张图片

do语句的执行流程

首先直接进入循环语句再进入判断语句,而在执行语句过程中,也会遇到break和continue。

【C语言】分支语句与循环语句_第33张图片

do语句中的break和continue关键字 

图一

 【C语言】分支语句与循环语句_第34张图片

 图二【C语言】分支语句与循环语句_第35张图片

do语句的特点:

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

你可能感兴趣的:(c语言,开发语言,后端,学习)