“C语言部分-Day04”
一、语句
1.1 选择语句
1.1.1 if语句
if语句的案例:
if…else if…else语句的案例:
1.1.2 switch语句
switch语句的案例:
注意事项:
1、expr(即案例中的grade)的值必须是int类型或者char类型
2、case后面的值也必须是int类型或者char类型的常量表达式
3、不能使用重复的标签
4、多个分支标号可以共用一条语句,例如:
5、如果缺省break
可能出现case穿透的现象,例如
switch语句和if…else语句的比较:
- if…else语句比switch语句更加通用
- 但是switch语句比if….else语句可读性高
- switch语句的执行效率优于if…else语句
1.2 循环语句
1.2.1 while语句
while语句的案例:
1.2.2 do…while语句
do..while语句的案例,将while语句的案例重写:
那么do…while和while的区别是什么?
- 唯一区别:当初始条件为假时,do..while语句循环会执行一次,而while语句一次都不会执行,例如:
do..while会执行一次:
while一次也不执行:
1.2.3 for语句
for语句的案例:
注意事项:
for语句的expr1、expr2、expr3都可以省略,若省略expr2,其默认为true
[不建议单独省略]
for语句的惯用法:
1.3 跳转语句
1.3.1 break语句
用于跳出switch、for、while、do…while、for等语句,例子
注意事项:
当switch、while、do..while、for语句嵌套时,break语句只能跳出包含break的最内层嵌套,例如:
1.3.2 continue语句
continue语句和break语句的区别:
- break可以用于循环语句和switch语句,而continue语句只能用于循环语句
- break语句是跳出整个循环(循环彻底结束),而continue语句是跳转到循环体的末尾(结束当前循环,开启下一次循环)
continue语句的案例:
1.3.3 go to语句
break语句只能跳转到switch或循环语句的下一条语句,continue只能跳转到循环体的末尾,而go to语句没有上面的限制,能在同一函数内随意跳转:
使用场景一,跳出外层嵌套:
使用场景二,用于错误处理
注意事项:
使用go to容易造成,因此需要尽量少用,只有当其它方式实现不了时,再来考虑它
二、数组
数组的模型
- 数组是一片连续的内存空间,被划分为大小相等的小空间
- 可以随机访问数组元素(在O1的时间复杂度内访问数组任意一元素)
2.1 关于数组的两个问题
Q1:为什么大多数语言中,数组的索引都是从0开始?
如果从1开始,每次寻址会多一次减法运算,浪费CPU资源
Q2:为什么数组的效率高于链表?
- 数组的内存空间是连续的,而链表是不连续的,数组可以更好的利用CPU高速缓存,有预读效果
- 数组只需要存储数据,而链表需要存储数据+指针域,链表的内存占用更高
2.2 数组的声明和初始化
声明数组
注意事项:
数组的SIZE必须是是整型的常量表达式,在编译期间能计算数组的大小
数组的初始化:
注意事项:
数组的初始化长度,不能大于数组的长度
2.3 对于数组使用sizeof计算数组的size
sizeof使用案例:
当我们需要对一个数组做循环,普通的操作是:
但如果数组不只一个呢?for循环就要写很多个,修改起来比较麻烦
最佳的解决方法,使用sizeof计算数组大小
注意事项:
记录踩的坑…….
数组当参数传入的时候,sizeof会计算形参的大小,而不是计算实参的大小。
arry size = 2的来源。
2.4 多维数组
二维、三维、四维….数组,都叫做多维数组,例如:
2.4.1 二维数组
二维数组在内存中的状态,以matrix[3][4]
为例
二维数组的初始化:
可以省略行,其余的会默认补充为0
也可以省略列,其余元素也会默认补充为0
甚至可以省略大括号【不建议】
全部初始化0:
可以由编译器判断行的大小:
注意事项:
不能省略列的大小
2.4.2 常量数组
常量数组的元素不会发生改变,案例如下:
2.5 数组实战:随机发牌小程序
用户指定发几张牌,程序打印出手牌(52张,去除大小鬼),使用效果:
案例代码: