本篇写的内容是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语句语法结构:
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(表达式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语句的特点:
循环至少执行一次,使用的场景有限,所以不是经常使用。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)