结构
C语言是结构化的程序设计语言,它支持三种结构,分别是顺序结构,选择结构,循环结构。
语句
控制语句
控制语句用于控制程序的执行流程,以实现程序的各种结构方式(顺序结构、选择结构、循环结构),它们由特定的语句定义符组成。
C语言有九种控制语句,可分成以下三类:
1. 分支语句:if、switch;
2. 循环语句:do while、while、for;
3. 转向语句:break、goto、continue、return。
if
-
单分支
-
双分支
-
多分支
-
例子
这个例子有同学会问,我age能不能写成 18 <= age <= 30 这种形式呢?答案是不能,这种形式在数学上可行,但在代码上不行,因为它会先判断 18 <= age 返回结果为真(1)或假(0),然后才和30进行比较。
其次,有人会问这段代码都去掉else可以吗?答案是可以的,这样的话age会进入每个if判断,效率低下,加else的目的是当一个if成立就不会往下走其他的if了。
还有一点,if默认只能控制一个语句,如果你是多条语句,则需要加上大括号,大括号括起来的代码叫代码块。
C语言中如何表示真假?假(0),真(非0)。
-
代码规范
悬空else
上图这份代码运行结果大部分人会被误导为haha,首先,这份代码的写法不规范,其次,else的匹配规则是找上面最近的if,而不是看是否对齐。
当一个常量和一个变量在比较相等的时候,可以把常量放在左边,这样万一写少了一个等号可以直接把错误暴露在编译器下。
switch
在switch语句中,我们没办法直接实现分支,搭配break使用才能实现真正的分支。
- 如果你想多个case执行同一个效果,那么可以写以下代码。
switch的执行逻辑是先进入匹配的case,然后往下执行,遇到break才会跳出。
- 如下图,如果所有case都不匹配但你也想输出东西的话,你可以使用default。
default与case没有顺序位置的要求。
switch允许嵌套使用,遇到break只会跳出一层switch。
while
- while语句中的break和continue。
如上图,这里的输出结果是1 2 3 4 ,因为到5的时候有break退出了循环,break的作用就是终止循环,不过只能终止一层循环。
如上图,这里的输出结果是1 2 3 4 死循环,因为continue的作用是跳过continue后面的代码,直接去while判断。
- getchar()与putchar()
getchar(),读取一个字符,无参,返回类型int,读取正常返回字符的ascii码值,读取失败返回EOF,EOF本质是-1。
putchar(),打印一个字符。
上图输出结果是你输入一个东西,它原样打印。
EOF - end of file,ctrl z 可以让getchar()返回EOF。
- getchar()清理缓冲区
上图,理论上有两个scanf我应该要输入两次吧,然而实际情况是我只输入了一次就返回结果了,为什么?
因为scanf与键盘之间还有一个输入缓冲区,我们敲打键盘进入输入缓冲区然后scanf在输入缓冲区读取,如果输入缓冲区为空那么scanf会等待,如上图我们输入了123456\n,scanf会读取\n前面的东西也就是123456,接下来第二个scanf看到输入缓冲区有东西就直接读了,所以造成了没有第二次输入的现象。
解决方法:既然多了一个字符那我们把它拿走是不是就可以了呢?
还有一种情况,假如我们第一次输入有空格,scanf只会读空格前面的,那么此时输入缓冲区就会剩下一个或多个字符,这时候就需要用循环getchar()处理了。
比如我们输入的是123456 sdfgsdgd\n,那么第一个scanf拿到123456,剩下空格到回车的内容就交给getchar()处理了。
for
既然有了while为什么还要for?答案:因为while的初始化部分,判断部分,调整部分比较分散,遇到庞杂的代码就不方便了。
我们发现在for循环中也可以出现break和continue,他们的意义和在while循环中是一样的。
- for语句的循环控制变量
1. 不可在for 循环体内修改循环变量,防止 for 循环失去控制。
2. 建议for语句的循环控制变量的取值采用“前闭后开区间”写法。
- 一些for循环的变种
下图,for循环中的初始化部分,判断部分,调整部分是可以省略的
但是初始化部分的省略自己得留个心眼,比如一些for循环嵌套,如下图,当第一次外层循环走了一次,内层循环走完后,j的值会一直保留。
下图是表达式可以写多个内容
下图循环多少次?答案:0,因为我直接看判断部分,k=0,将0赋值给k,最后结果为0(假),所以不进入循环。
do while
- 结构
- 特点
循环至少执行一次
goto
- 语法
goto again 就是跳到again的地方。只能在一个函数内跳转,不能跨函数。
- 适合场景
终止某些深度嵌套的结构,一次跳出多层循环。
相关练习
1.
答:B
2.
答:8
3.在屏幕上输出9*9乘法口诀表
补充细节,有些结果是一位数有些是两位数,如何对齐美观?
%2d可以打印两位整数,如果没有两位则左边用空格填充。
%-2d就是右边用空格填充。
4.求10个整数中最大值
思路:输入10个数,从这10个数随便取一个当最大值,遍历比较谁大谁就是最大值。
5.计算1/1 - 1/2 + 1/3 - 1/4 + 1/5 ... + 1/99 - 1/100的值,打印结果。
关键点:这里的1/2, 1/3...整形的话是等于0的。想要小数结果,除号两端至少有一个是浮点数。
6.编写程序数一下1到100的所有整数中出现多少个数字9。
思路:个位为9的:9,19,29,39,49,59,69,79,89,99
十位为9:90,91,92,93,94,95,96,97,98,99
我们可以发现99出现了两次。这里不能用else if, 因为99需要判断两次。
7.小乐乐求和
思路:计算1到n的和。等差数列求和公式:(首项+尾项)*项数 / 2
8.小乐乐找最大数
方法1
方法2
9.判断是不是字母
关键点:注意清理缓冲区的\n。
方法1
方法2
isalpha()可以判断是否是字母,是返回非零,不是返回0。
10.网购
- 代码仓库
Branch_Loop/Branch_Loop/test.c · 林宇恒/code_c - 码云 - 开源中国 (gitee.com)