switch 选择结构
/*
if(条件表达式){
代码块
}
switch(条件表达式){
case 整数:
语句;
break;
case 整数:
语句;
break;
default:
语句;
break;
}
// switch 会取出条件表达式的值,如果与 case 后面整数相等就会执行这个 case 下的语句,break 就会跳出,如果前面的都不满足,那么就会执行 default
// 1,拿到的条件表达式的值必须是整数才行
// 2,利用条件表达式的值与 case 后面的整数是否相等,如相等,就会执行该 case 后面的语句,
// 3,执行完该语句,遇到 break 就会结束整个 switch 语句,也就是说后面得有语句都不会执行
// 4,如果前面的 case 后面值与条件表达式的值不相等就会继续执行后面的 case
// 5,如果前面的条件表达式与 case 的整数都不相等就会执行 default 的case
*/
int age = 1;
switch (age) {
case 3:
printf("还在喝奶的阶段");
break; // 执行到 break 就会结束 switch 语句
case 6:
printf("该上小学了");
break;
case 18:
printf("该去网吧打游戏了");
break;
default:
printf("该好好上班,挣钱养家");
break;
}
- switch 的结束
- 执行到相等的 case 后面的整数,遇到 break
- 执行到 switch 语句的大括号
- 如果执行到对应的 case 时,但是没有写 break,此时后面的 case 和 default 语句会失效,但是里面的代码块不会失效(case 的穿透问题)
int age = 6; // age = 6 的时候
switch (age) {
case 3:
printf("还在喝奶的阶段");
break;
case 6:
printf("该上小学了"); // 执行到这个 case 的代码,但是没有写 break,后面的 case 和 default 代码就会失效.但是里面的代码块像 parinf 不会失效
// 没有写 break
case 18:
printf("该去网吧打游戏了");
// 没有写 break
default:
printf("该好好上班,挣钱养家");
// ,没有写 break
}
// 相当于执行了这个代码
int age = 6; // age = 6 的时候
switch (age) {
case 3:
printf("还在喝奶的阶段");
break;
case 6:
printf("该上小学了"); // 执行到这个 case 的代码,但是没有写 break,后面的 case 和 default 代码就会失效.但是里面的代码块像 parinf 不会失效
// 没有写 break
// case 18:
printf("该去网吧打游戏了");
// 没有写 break
// default:
printf("该好好上班,挣钱养家");
// ,没有写 break
}
// 控制台输出:
该上小学了该去网吧打游戏了该好好上班,挣钱养家
-
最后一个case 或者 default后面的 break 可以省略,因为后面就是switch 的大括号,也是代表 switch 的结束
-
switch 的注意点
- Switch的条件表达式必须是返回整数的格式,也就是说()中只能放整数
// 只有整数类型才可以哦 float num = 10.3f; switch (num) { // 报错 case 10: printf("是一个小数,会打印么?"); break; default: break; } // char 类型可以,char 类型可以转换为整数 char str = 'a'; switch (str) { case 'a': printf("char 类型是可以的,因为 char 类型可以转换为整数,char 类型的底层是阿斯克码😔"); break; default: printf("😔"); break; }
- case 的取值必须是整数,或者能够转换为整数的类型
- case 的取值不能重复
int num = 10; switch (num) { case 10: printf("10"); break; case 10: // 报错,case 不能重复 printf("10"); break; default: printf("😔"); break; }
- case 后面不能放变量
- 因为系统在编译的时候会对 switch后面的 case进行优化,会根据后面 case 的值生成一个取值表
int num = 10; switch (10) { case num: // 报错,不能放变量 printf("10"); break; default: printf("😔"); break; }
- default 的位置
- 无论 default 的位置写在哪个位置,都是最后执行
- 如果 default 放在前面了,那么就一定要加上 break,不能省略
- 只要 default 满足,那么后面的 case 也会失效,所以注意写上 break
switch 练习
/*
要求用户输入一个分数,根据用户输入的分数输出对应的等级
A 90 - 100
B 80 - 89
C 70 - 79
D 60 - 69
E 0 - 59
*/
printf("请您输入一个分数,已回车结束\n");
int garde = 0;
scanf("%i",&garde);
// 第一种方法
switch (garde / 10) { // 分数除以 10 再利用隐式转换为 int 类型就可以得到整数
case 10: // 利用 case 的穿透
case 9:
printf("A");
break;
case 8:
printf("B");
break;
case 7:
printf("C");
break;
case 6:
printf("D");
break;
default:
printf("E");
break;
}
// 第二种方法
if (garde >= 90 && garde <= 100){
printf("A");
}else if (garde >= 80 && garde <= 89)
{
printf("B");
}else if (garde >= 70 && garde <= 79)
{
printf("C");
}else if (garde >= 60 && garde <= 69)
{
printf("D");
}else if (garde >= 0 && garde <= 59)
{
printf("E");
}else{
printf("输入成绩错误");
}
// 第三种方法(巧妙的利用 if else if 的结构,从上往下执行,第一条不满足执行到第二条,执行到后面的 else if 代表肯定前面的条件不符合.所以)
if (garde < 0 || garde > 100){
printf("您输入的分数不对");
}else if (garde >= 90 && garde <= 100){
printf("A");
}else if (garde >= 80)
{
printf("B");
}else if (garde >= 70)
{
printf("C");
}else if (garde >= 60)
{
printf("D");
}else{
printf("E");
}
return 0;
}
- switch 的局限性
- 在开发中中 if 比较多,比较灵活
- 如果说是对固定的值,进行判断,并且这些值的数量不多的时候可以使用 switch
- 从理论上来说 switch的性能效率要比 if 高
// 练习 2
/*
// 从键盘输入一个数字,判断其是哪个季节
printf("请您输入一个数字,以回车结束");
int num = 0;
scanf("%i",&num);
switch (num) {
case 12:
case 1:
case 2:
printf("冬季");
break;
case 3:
case 4:
case 5:
printf("春节");
break;
case 6:
case 7:
case 8:
printf("夏季");
break;
case 9:
case 10:
case 11:
printf("秋季");
break;
default:
printf("你输入的是啥玩意");
break;
}
*/
// 写一个计算器,用户输入一个数,操作符,再一个数,根据操作符计算结果
/*
printf("请您输入第一个数,操作符,和第三个数,以逗号分割,以回车结束\n");
printf("操作符:1:+,2:-,3:/,4:*\n");
int num1,num2,num3;;
scanf("%i,%i,%i",&num1,&num2,&num3);
switch (num2) {
case 1:
printf("两数相加:result = %i\n",num1+num3);
break;
case 2:
printf("两数相减:result = %i\n",num1-num3);
break;
case 3:
printf("两数相除:result = %i\n",num1/num3);
break;
case 4:
printf("两数相乘:result = %i\n",num1*num3);
break;
default:
printf("num2只接受 1-4 的整数");
break;
}
*/
printf("请您输入第一个数,以回车结束\n");
int num1,num2;
scanf("%i",&num1);
printf("请您输入操作符,以回车结束\n");
// char temp;
// scanf("%c",&temp);
getchar(); // 使用getchar()将前面的\n 取出来
char op;
scanf("%c",&op); // 此时注意前面有一个scanf 函数,输入了回车后此时输入缓冲区中还是保留的\n,所以第二个 scanfr 让输入一个%c 类型的字符时就不会让你输入了
printf("请您输入第二个数,以回车结束\n");
scanf("%i",&num2);
int result = -1;
switch (op) {
case '+':
result = num1 + num2;
break;
case '-':
result = num1 - num2;
break;
case '*':
result = num1 * num2;
break;
case '/':
result = num1 / num2;
break;
default:
printf("只接受 '+','-','*','/' 操作符");
break;
}
printf("result = %i\n",result);
return 0;
}