## 选择结构 - C语言中提供了两大选择结构, 分别是if和switch ## 选择结构if - if第一种形式 + 表示如果表达式为真,执行语句块1,否则不执行 ```c if(表达式) { 语句块1; } 后续语句; ``` ```c if(age >= 18) { printf("开网卡\n"); } printf("买烟\n"); ``` - if第二种形式 + 如果表达式为真,则执行语句块1,否则执行语句块2 + else不能脱离if单独使用 ```c if(表达式){ 语句块1; }else{ 语句块2; } 后续语句; ``` ```c if(age > 18){ printf("开网卡\n"); }else{ printf("喊家长来开\n"); } printf("买烟\n"); ``` - if第三种形式 + 如果"表达式1"为真,则执行"语句块1",否则判断"表达式2",如果为真执行"语句块2",否则再判断"表达式3",如果真执行"语句块3", 当表达式1、2、3都不满足,会执行最后一个else语句 + 众多大括号中,只有一个大括号中的内容会被执行 + 只有前面所有添加都不满足, 才会执行else大括号中的内容 ```c if(表达式1) { 语句块1; }else if(表达式2){ 语句块2; }else if(表达式3){ 语句块3; }else{ 语句块4; } 后续语句; ``` ```c if(age>40){ printf("给房卡"); }else if(age>25){ printf("给名片"); }else if(age>18){ printf("给网卡"); }else{ printf("给好人卡"); } printf("买烟\n"); ``` - if嵌套 + if中可以继续嵌套if, else中也可以继续嵌套if ```c if(表达式1){ 语句块1; if(表达式2){ 语句块2; } }else{ if(表达式3){ 语句块3; }else{ 语句块4; } } ``` --- - ***if注意点*** + 任何数值都有真假性 ```c #include int main(){ if(0){ printf("执行了if"); }else{ printf("执行了else"); // 被执行 } } ``` - 当if else后面只有一条语句时, if else后面的大括号可以省略 ```c // 极其不推荐写法 int age = 17; if (age >= 18) printf("开网卡\n"); else printf("喊家长来开\n"); ``` - 当if else后面的大括号被省略时, else会自动和距离最近的一个if匹配 ```c #include int main(){ if(0) if(1) printf("A\n"); else // 和if(1)匹配 printf("B\n"); else // 和if(0)匹配, 因为if(1)已经被匹配过了 if (1) printf("C\n"); // 输出C else // 和if(1)匹配 printf("D\n"); } ``` - + 如果if else省略了大括号, 那么后面不能定义变量 ```c #include int main(){ if(1) int number = 10; // 系统会报错 printf("number = %i\n", number); } ``` ```c #include int main(){ if(0){ int number = 10; }else int value = 20; // 系统会报错 printf("value = %i\n", value); } ``` - C语言中分号(;)也是一条语句, 称之为空语句 ```c // 因为if(10 > 2)后面有一个分号, 所以系统会认为if省略了大括号 // if省略大括号时只能管控紧随其后的那条语句, 所以只能管控分号 if(10 > 2); { printf("10 > 2"); } // 输出结果: 10 > 2 ``` - 但凡遇到比较一个变量等于或者不等于某一个常量的时候,把常量写在前面 ```c #include int main(){ int a = 8; // if(a = 10){// 错误写法, 但不会报错 if (10 == a){ printf("a的值是10\n"); }else{ printf("a的值不是10\n"); } } ``` --- - if练习 + 从键盘输入一个整数,判断其是否是偶数,如果是偶数就输出YES,否则输出NO; + 接收用户输入的1~7的整数,根据用户输入的整数,输出对应的星期几 + 接收用户输入的一个整数month代表月份,根据月份输出对应的季节 + 接收用户输入的两个整数,判断大小后输出较大的那个数 + 接收用户输入的三个整数,判断大小后输出较大的那个数 + 接收用户输入的三个整数,排序后输出 - 实现石头剪刀布 ```c 剪刀石头布游戏: 1)定义游戏规则 剪刀 干掉 布 石头 干掉 剪刀 布 干掉石头 2)显示玩家开始猜拳 3)接收玩家输入的内容 4)让电脑随机产生一种拳 5)判断比较 (1)玩家赢的情况(显示玩家赢了) (2)电脑赢的情况(显示电脑赢了) (3)平局(显示平局) ``` ![](https://img-blog.csdnimg.cn/img_convert/672ff35609edd25e6aa45a8adf1a6225.png) ![](https://img-blog.csdnimg.cn/img_convert/cb273336e304bc40948bfacebbdf01ed.png) ![](https://img-blog.csdnimg.cn/img_convert/a44287edc332fab3fc13d7da196899a9.png) --- ## 选择结构switch - 由于 if else if 还是不够简洁,所以switch 就应运而生了,他跟 if else if 互为补充关系。switch 提供了点的多路选择 - 格式: ```c switch(表达式){ case 常量表达式1: 语句1; break; case 常量表达式2: 语句2; break; case 常量表达式n: 语句n; break; default: 语句n+1; break; } ``` - 语义: - 计算"表达式"的值, 逐个与其后的"常量表达式"值相比较,当"表达式"的值与某个"常量表达式"的值相等时, 即执行其后的语句, 然后跳出switch语句 - 如果"表达式"的值与所有case后的"常量表达式"均不相同时,则执行default后的语句 - 示例: ```c #include int main() { int num = 3; switch(num){ case 1: printf("星期一\n"); break; case 2: printf("星期二\n"); break; case 3: printf("星期三\n"); break; case 4: printf("星期四\n"); break; case 5: printf("星期五\n"); break; case 6: printf("星期六\n"); break; case 7: printf("星期日\n"); break; default: printf("回火星去\n"); break; } } ``` --- - switch注意点 + switch条件表达式的类型必须是整型, 或者可以被提升为整型的值(char、short) ```c #include int main() { switch(1.1){ // 报错 case 1: printf("星期一\n"); break; case 2: printf("星期二\n"); break; default: printf("回火星去\n"); break; } } ``` - +case的值只能是常量, 并且还必须是整型, 或者可以被提升为整型的值(char、short) ```c #include int main() { int num = 3; switch(1){ case 1: printf("星期一\n"); break; case 'a': printf("星期二\n"); break; case num: // 报错 printf("星期三\n"); break; case 4.0: // 报错 printf("星期四\n"); break; default: printf("回火星去\n"); break; } } ``` - case后面常量表达式的值不能相同 ```c #include int main() { switch(1){ case 1: // 报错 printf("星期一\n"); break; case 1: // 报错 printf("星期一\n"); break; default: printf("回火星去\n"); break; } } ``` - case后面要想定义变量,必须给case加上大括号 ```c #include int main() { switch(1){ case 1:{ int num = 10; printf("num = %i\n", num); printf("星期一\n"); break; } case 2: printf("星期一\n"); break; default: printf("回火星去\n"); break; } } ``` - switch中只要任意一个case匹配, 其它所有的case和default都会失效. 所以如果case和default后面没有break就会出现穿透问题 ```c #include int main() { int num = 2; switch(num){ case 1: printf("星期一\n"); break; case 2: printf("星期二\n"); // 被输出 case 3: printf("星期三\n"); // 被输出 default: printf("回火星去\n"); // 被输出 break; } } ``` - switch中default可以省略 ```c #include int main() { switch(1){ case 1: printf("星期一\n"); break; case 2: printf("星期一\n"); break; } } ``` - switch中default的位置不一定要写到最后, 无论放到哪都会等到所有case都不匹配才会执行(穿透问题除外) ```c #include int main() { switch(3){ case 1: printf("星期一\n"); break; default: printf("Other,,,\n"); break; case 2: printf("星期一\n"); break; } } ``` --- - ***if和Switch转换*** - 看上去if和switch都可以实现同样的功能, 那么在企业开发中我们什么时候使用if, 什么时候使用switch呢? + if else if 针对于范围的多路选择 + switch 是针对点的多路选择 - 判断用户输入的数据是否大于100 ```c #include int main() { int a = -1; scanf("%d", &a); if(a > 100){ printf("用户输入的数据大于100"); }else{ printf("用户输入的数据不大于100"); } } ``` ```c #include int main() { int a = -1; scanf("%d", &a); // 挺(T)萌(M)的(D)搞不定啊 switch (a) { case 101: case 102: case 103: case 104: case 105: printf("大于\n"); break; default: printf("不大于\n"); break; } } ``` --- - 练习 + 实现分数等级判定 ```c 要求用户输入一个分数,根据输入的分数输出对应的等级 A 90~100 B 80~89 C 70~79 D 60~69 E 0~59 ``` - 实现+ - * / 简单计算器 最后,如果你有任何疑问,欢迎加微信 **leader_fengy** 拉你进学习交流群