栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

【C语言初阶学习笔记】分支和循环(一)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【C语言初阶学习笔记】分支和循环(一)

前提:

1、C语言是结构化的程序设计语言

2、C语言中有3种结构:顺序结构、选择结构、循环结构


一、什么是语句

C语言中由一个分号 ; 隔开的就是一条语句。


二、分支语句(选择结构)

if语句:

      语法结构:



 



下面我们再来看这样一个代码:

age 就是10啊,不在18与30之间啊,为什么还会打印出 青年 呢?

别急,原因是这样的:18<=age,条件是假,就是0;0<30,条件一定是真的,所以就打印出了 青年。因此,在C语言中,要想满足18<=age<30,应该写成:18<=age && age<30哦。 

说明:在C语言中,0表示假,非0表示真。


 猜猜看下面的代码打印出什么结果?

实际上打印出的结果是:

这个结果你猜对了吗? 

实际上,if语句中,单条语句可以直接书写,而多条语句则需要用{ }给括起来才可以,否则的话就会执行if下面的第一条语句。

举例说上面的代码,不管age的值是不是大于18,可以谈恋爱了肯定会被打印出来了。


 悬空else:

让我们再看一看这样一个代码:

编译结果:

 什么都没有打印,是不是感到晕乎乎的。原来,这个是else的匹配规则——else与距离最近的if进行匹配。 


 所以说,良好的代码风格非常重要哦。

上面的代买就可以改成这样就一目了然了:


下面我们再来看一看这个代码:

编译起来的结果是这个吖子滴:

同学们就会发现,这是咋回事啊,怎么还打印出来 呵呵 呢?

= 赋值的意思

==判断是否相等

同学们把赋值和判断搞混淆了,num=5,5是非0的数为真,所以打印出来了。


switch语句:

switch 语句也是一种分支语句。 常常用于多分支的情况。 很明显,这种代码就写得非常的长,感觉不是写的很好。 因此,switch语句就上场了:

当然,如果case后面的语句比较复杂,需要用{ }给括起来也是没有任何问题的:

说明:

1. switch后面的( )里面的值必须是整型表达式的值;case后面的值必须是整型常量表达式的值(当然字符也是可以的,字符底层存储的也是ASCII码值)。

2.break是实现分支的真正要义之所在(switch的入口是case,出口是break;break的作用是直接跳出

   当前的switch语句,不执行后续操作)。

3.当然,并不一定所有的case后面的都要加上break:

4.default 的用法是:当所有的case中整型常量表达式的值都不满足时,执行default中的语句;并且default可以出现在case语句的任何地方(只不过一般上习惯把default放在后面)。


其实,switch是可以嵌套使用的,下面我们来看一下这个例子:

 聪明的你是不是已经知道代码的运行结果了呢?


 三、循环语句

常见的循环语句有:while循环、for循环、do...while循环,下面我们会慢慢介绍这些循环结构:

while循环:

下面我们来看这样一个例子:

由此可以知道,if语句只循环了一次;

现在,将if改成while试试看编译结果:

由此可见,该语句进入了死循环。

while(表达式),当表达式为真时,就会一直执行下面的语句,直到表达式为假。


while循环的执行流程(举个例子)

执行的流程是:1->2->3->1->2->3......


有的时候我们在循环里头会看见这两个小东西:break、continue,那么,这两个小东西到底有什么作用呢?

break在while循环里面的作用:

原来的代码如果没有break,就直接打印出1 2 3 4 5 6 7 8 9 10的结果,而加了break以后,却只打印了1 2 3 4 的结果。这是怎么回事呢?

原来,在循环语句里遇到break,就直接终止了循环,直接跳到了循环体的外头(打印了1 2 3 4 以后,i=5时if条件成立,就会执行break语句,由1语句直接跳到了2语句)。


 continue在while循环里面的作用:

由图可知,编译结果是:1 2 3 4 死循环,这是为什么呢?

原来,continue的作用是:跳过本次循环(后面的代码不会执行了),直接跳到判断部分,判断下一次的循环是否会执行(打印出1 2 3 4 以后,i=5时,执行continue语句,直接跳到判断部分;然后i还是5,继续......就一直死循环下去了 由1语句跳到了2语句)。


 getchar() 和 putchar()函数:

    getchar():从键盘获取字符

    putchar():把字符打印到屏幕

当然,getchar和scanf还是不一样的(getchar是用来接收字符的,scanf可以接收好多东西,接收字符的是一样的) 


为什么获取字符的要放到int 里面去呢?

原因有两点:1、返回的字符,本质是字符也是ASCII码值,是整数;

                      2、getchar函数不仅仅返回正常字符还会返回EOF(是-1),所以放在整型变

                            中。 

说明:1、EOF:end of file 文件结束标志;

           2、getchar读取失败的时候就会返回EOF;      

           3、键盘输入:Ctrl+Z就会退出去。


应用场景:

按理来说,有两个步骤:输入密码,进行确认;

但是,结果却是这样的:输入密码后,回车,直接是确认失败:

为什么是这样呢?实际上这是输入缓冲区的原因:

像scanf、getchar这样的函数,在读取数据的时候其实是从输入缓冲区读取的。首先,scanf获取信息,先看输入缓冲区,什么都没有,就等待着键盘上输入的东西 abcdefn ,这时候scanf才把缓冲区里面的 abcdef 拿走,存储在password中,缓冲区里面还有一个;getchar读取数据的时候,发现缓冲区里面还有 n ,就直接把它拿走了,放进了ch中,不会再等待。

如果想要这个效果,就需要这样做:

这样子就可以等待了;

不过也是不可取的,因为这个只能解决缓冲区只有一个n的问题:

输入密码以后回车,就直接出现了失败。

为什么呢?其实非常简单:和上面的分析过程差不多,不过,scanf用%s读取数据的时候,碰到空格就不读了,剩下的就不仅仅只有上面的n了,还有 空格123456n,getchar先把空格读取走,下面的getchar就读取了1(getchar一次只能读取一个空格),然后就只能确认失败了(当然,以后如果想要一个密码带有空格的,就需要把scanf函数换成gets函数,这里就不再过多赘);述要想彻底解决这个问题,则需要这样做(因为不管输入什么密码,最后一个肯定都是n);


scanf

输入部分中间有空格

然后监视窗口到了空格部分以后就没有输入上去了,并且空格部分用了一个

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/348096.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号