-
顺序结构:
- 按书写顺序从上至下依次执行
-
选择结构
- 对给定的条件进行判断,再根据判断结果来决定执行代码
-
循环结构
- 在给定条件成立的情况下,反复执行某一段代码
选择结构if
- if选择结构格式
- 第一种格式:
if(条件表达式){
条件成立执行的语句
}
其它语句
第二种格式:
if(条件表达式){
条件成立执行的语句
}else{
条件不成立执行的语句
}
第三种格式:
if(条件表达式1){
条件满足执行的语句
}else if(条件表达式2){
条件满足执行的语句
}else if(条件表达式3){
条件满足执行的语句
}else{
条件不成立执行的语句
}
if注意点
- 1.if可以省略大括号
- 如果if省略大括号, 那么只有紧随其后的那条语句受到控制
int age = 17;
if(age >= 18)
printf("开网卡\n");//条件不满足,不执行
printf("买饮料\n");
- 2.{}可以单独出现, {}出现的时候代表是一个代码块
- {
int age = 88;
printf("age = %i\n", age);
}
printf("age = %i\n", age);
-
3.如果if省略了大括号, 那么不能再后面直接定义变量
从表面上, num的作用域是从定义的那一行开始, 直到遇到}结束或者return为止
但是从实际上而言, num只有if的条件满足才会执行, 所以两者冲突
int age = 18;
if(age >= 18)
int num = 666;
printf("开网卡\n");
-
4.除了if以外elseif还有else也可以省略大括号
省略大括号之后的特点和if省略之后一样
只有紧随其后的语句受到控制
也不可以直接定义变量int age = 41;
if(age >= 40)
printf("40\n");
else if(age >= 30)
printf("30\n");
else
printf("other\n");
printf("40 2222\n");- 5.任何数值都有真假性
if(0){
printf("abc");
}
int age = 3;
if(age = 18){
printf("被执行了\n");
}if(18 == age){ // 在企业开发中如果要判断是否相等, 建议把常量写在起那么, 把变量写在后面
printf("被执行了\n");
}double num = 3.14;
// 在企业开发中一定不要使用==来判断两个小数是否相等
// 因为小数可能出现精度问题
// 如果在企业开发中要判断两个小数是否相等, 那么建议使用 >= <=
if(3.14 == num){
printf("是3.14\n");
}
- 6.如果if else省略大括号的时, else会自动匹配距离自己最近的那个if
// 但是有一个前提条件, 就是这个if没有被其它的else匹配
// 注意点: 编译器会把if else看做是一个整体
// if(0)
// if(1)
// printf("A\n");
// else // 和if(1)匹配
// printf("B\n");
// else // 和if(0)匹配, 因为if(1)已经被匹配过了
// if (1)
// printf("C\n");
// else // 和if(1)匹配
// printf("D\n");
一般企业开发中不会省略
// if(0)
// if(1)
// printf("A\n");
// else if(1) // 和if(1)匹配
// printf("B\n");
// else
// printf("c\n");
// else // 和if(0)匹配, 因为if(1)已经被匹配过了
// if (1)
// printf("D\n");
// else if(1) // 和if(1)匹配
// printf("F\n");
// else
// printf("G\n");
- 7.if可以嵌套if
// if(1){
// if(0){
// printf("A\n");
// }else{
// printf("B\n");
// }
// }else{
// if(1){
// printf("C\n");
// }else{
// printf("D\n");
// }
// }
选择结构switch
-
switch选择结构的格式:
switch(表达式){
case 表达式1: // 相当于else if
被表达式1控制的语句;
break;
case 表达式2: // 相当于else if
被表达式2控制的语句;
break;
default: // 相当于else
被default控制的语句;
break;
}- 执行流程:
1.计算switch后面()中表达式的结果
2.利用计算的结果从上至下的和switch后面{}中的case的表达式的值一次比较
3.一旦发现switch表达式的值和case表达式的值相同, 就执行该case后面的语句
4.一旦某个case被执行了, 其它的case就不会执行了
5.如果所有case表达式的值和switch表达式的值都不相等, 那么就执行default后面的语句
- 执行流程:
int day = 3;
switch(day){
case 1:
printf("星期一\n");
break;
case 2:
printf("星期二\n");
break;
default:
printf("Other\n");
break;
}
- 注意点
-
switch条件表达式的类型必须是整型, 或者可以被提升为整型的值(char、short)
-
- default书写的位置, 可以随便写
// 无论default是否是写在switch语句的最后, 都会最后执行
// 如果default不是写在最后的, 那么break不能省略, 省略就会发生穿透问题
// 记住一点: 永远把default写在最后 - switch后面的()中只能表达式/变量/常量, 并且必须是整型或者能够被提升为整型的
// int num = 1;
// switch(num){ // 放一个变量
// switch(2){ // 放一个常量
// switch(1 + 1){ // 放一个表达式
// switch(1.1){ // 会报错, 小数不能提升为整型
// 不会报错, char类型可以提升为int类型
// char类型底层的本质存储的是ASCII码, 而ASCII码就是整型
// switch('a'){
// case 1:
// printf("A\n");
// break;
// case 2:
// printf("B\n");
// break;
// default:
// printf("Other\n");
// }
- switch的case后面只能放常量和表达式, 并且必须是整型或者能够被提升为整型的
// int num = 1;
// switch(2){
// case 1: //常量
//// case num: // 变量, 会报错
// printf("A\n");
// break;
// case 1 + 1: // 表达式
// printf("B\n");
// break;
// default:
// printf("Other\n");
// }
- switch的case后面的值不能重复
// int num = 1;
// switch(2){
// case 2:
// printf("A\n");
// break;
//// case 1: // 会报错
// case 1 + 1: // 会报错
// printf("B\n");
// break;
// default:
// printf("Other\n");
// }
- switch的case后面不能定义变量
如果要在case后面定义变量, 必须在case后面加上{}
switch(1){
case 1:{
int num = 666; // 会报错
printf("A\n");
break;
}
case 2:
printf("B\n");
break;
default:
printf("Other\n");
}
return 0;
}
循环结构
- C语言中提供了三大循环结构, 分别是while、dowhile和for
循环结构while
- 格式:
while ( 循环控制条件 ) {
循环体中的语句;
能够让循环结束的语句;
....
} - 示例
int count = 0;
while (count < 3) { // 循环控制条件
printf("发射子弹~哔哔哔哔\n"); // 需要反复执行的语句
count++; // 能够让循环结束的语句
}
whlie循环注意点
- 任何数值都有真假性
int count = 0;
while (count < 3) { // 循环控制条件
printf("发射子弹~哔哔哔哔\n"); // 需要反复执行的语句
count++; // 能够让循环结束的语句
}
-
当while后面只有一条语句时,while后面的大括号可以省略
- 如果while省略了大括号, 那么后面不能定义变量
int main(){
while (1) // 死循环
int num = 10; // 报错
// 没有能够让循环结束的语句
}
- while循环和if一样, 可以嵌套其它合法代码
while(条件表达式){
被控制的语句;
}
特点: 会先判断条件是否满足, 满足就执行{}中的代码do{
被控制的语句;
}while(条件表达式);
特点: 不会像判断条件是否满足, 会先执行一次{}中的代码, 然后再判断条件
while和dowhile的区别:
while会先判断条件再执行循环体
dowhile会先执行循环体再判断条件
while(0){
printf("被控制的语句\n");
}
do{
printf("被控制的语句\n");
}while (0);
// 在大部分的情况下while和dowhile是可以互换的
// 在企业开发中如果能够互换, 一般我们会使用while
循环结构for
- 格式
for(初始化表达式;循环条件表达式;循环后的操作表达式) {
循环体中的语句;
}
- 实例
for(int i = 0; i < 10; i++){
printf("发射子弹~哔哔哔哔\n");
}
-
for循环执行流程
+首先执行"初始化表达式",而且在整个循环过程中,只会执行一次初始化表达式- 接着判断"循环条件表达式"是否为真,为真执行循环体中的语句
- 循环体执行完毕后,接下来会执行"循环后的操作表达式",然后再次判断条件是否为真,为真继续执行循环体,为假跳出循环
- 重复上述过程,直到条件不成立就结束for循环
-
for循环注意点:
- 和while一模一样
- 最简单的死循环for(;;);
-
for和while应用场景
- while能做的for都能做, 所以企业开发中能用for就用for, 因为for更为灵活
- 而且对比while来说for更节约内存空间
四大跳转
C语言中提供了四大跳转语句, 分别是return、break、continue、goto
-
break:
- 立即跳出switch语句或循环
- 应用场景:
- switch
- 循环结构
-
注意点
- break离开应用范围,存在是没有意义的
-
continue
- 结束本轮循环,进入下一轮循环
- 应用场景:
- 循环结构
-
continue注意点:
- continue离开应用范围,存在是没有意义的
-
goto
- 这是一个不太值得探讨的话题,goto 会破坏结构化程序设计流程,它将使程序层次不清,且不易读,所以慎用
- goto 语句,仅能在本函数内实现跳转,不能实现跨函数跳转(短跳转)。但是他在跳出多重循环的时候效率还是蛮高的
-
return
- 结束当前函数,将结果返回给调用者
- 不着急, 放一放,学到函数我们再回头来看它
循环嵌套
- 循环结构的循环体中存在其他的循环结构,我们称之为循环嵌套
- 注意: 一般循环嵌套不超过三层
- 外循环执行的次数 * 内循环执行的次数就是内循环总共执行的次数
- 循环优化
- 在多重循环中,如果有可能,应当将最长的循环放在最内层,最短的循环放在最外层,以减少 CPU 跨切循环层的次数
for (col=0; col<5; col++ ) {
// 高效率:长循环在最内层
for (row=0; row<100; row++) {
sum = sum + a[row][col];
}
}
for(int i = 0; i< 5; i++) {
for(int j = i; j < 5; j++) {
printf("*");
}
printf("\n");
}