switch语句
switch 语句是⼀种特殊形式的 if…else 结构,用于判断条件有多个结果的情况。它把多重
的 else if 改成更易用、可读性更好的形式。
我们可以这样理解:if语句适用于判断条件较少的情况,因为if语句如果判断条件情况太多,我们就可能会用到if语句嵌套,或者用的else if太多。
具体的情况大概会这样:
if(条件1) if(条件2) { if(条件3) }`` //或者 if(条件1) {××××××;} else if(条件2) {××××××;} else if(条件3) {××××××;} else if(条件4) {××××××;} ...... else(条件) {××××××;}
显然这样就太复杂了,因此为了简便,我们可以用switch语句。
而switch语句的具体用法如下:
switch (表达式) { case 整形常量: 语句 case 整形常量: 语句 default: 语句 }
上面代码中,根据表达式为不同的值,执行相应的 case 分支。如果找不到对应的值,
就执行 default 分支。
特别注意:
switch 后的表达式必须是整型表达式
case 后的值,必须是整形常量表达式
我们举个例子:
输入任意⼀个整数值,计算除3之后的余数
使用switch语句
#include <stdio.h> int main() { int n = 0; scanf("%d", &n); switch (n % 3) { case 0: printf("整除,余数为0\n"); break; case 1: printf("余数是1\n"); break; case 2: printf("余数是2\n"); break; } return 0; }
上述的代码中,我们要注意的点有:
- case 和后边的数字之间必须有空格
- 每⼀个 case 语句中的代码执行完成后,需要加上 break ,才能跳出这个switch语句。
break的用法
前面的代码中我们应该大致了解到了switch语句的用法,那如果我们去掉case语句中的break,会出现什么情况呢?
#include <stdio.h> int main() { int n = 0; scanf("%d", &n); switch (n % 3) { case 0: printf("整除,余数为0\n"); case 1: printf("余数是1\n"); case 2: printf("余数是2\n"); } return 0; }
当我们输入7时,运行结果如图:
我们发现,7除以3本来余数是1,但是我们发现程序运行的结果多了⼀行“余数是2”的打印。
这是为什么呢?
原因是 switch 语句也是分支效果的,只有在 switch 语句中使用 break 才能在跳出 switch 语
句,如果某⼀个 case 语句的后边没有 break 语句,代码会继续玩下执行,有可能执行其他 case语句中的代码,直到遇到 break 语句或者 switch 语句结束。就比如上面的代码就执行了 case2 中的语句。
所以在 switch 语句中 break 语句是非常重要的,能实现真正的分支效果。
当然, break 也不是每个 case 语句都得有,这就得根据实际情况来看了。
下面有几个例子:
练习: 输⼊⼀个1~7的数字,打印对应的星期⼏ 例如: 输⼊:1 输出:星期⼀ 输⼊:2 输出:星期⼆ 输⼊:3 输出:星期三 输⼊:4 输出:星期四 输⼊:5 输出:星期五 输⼊:6 输出:星期六 输⼊:7 输出:星期天 #include <stdio.h> int main() { int day = 0; scanf("%d", &day); switch (day) { 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; } return 0; }
如果需求发⽣变化,变为: 1. 输⼊1-5,输出的是“⼯作⽇”; 2. 输⼊6-7,输出“休息⽇ #include <stdio.h> int main() { int day = 0; scanf("%d", &day); switch (day) { case 1: case 2: case 3: case 4: case 5: printf("⼯作⽇\n"); break; case 6: case 7: printf("休息⽇\n"); break; } return 0; }
上面的例子中,我们发现应该根据实际的情况,来在代码中觉得是否使用 break ,或者在哪里使用break ,才能正确完成实际的需求。
default的用法
在使用 switch 语句的时候,我们经常可能遇到⼀种情况,比如 switch 后的表达式中的值无法匹配代码中的 case 语句的时候,这时候要不就不做处理,要不就得在 switch 语句中加入default 子句。
switch (表达式) { case 整形常量1: 语句 case 整形常量2: 语句 default:语句 }
switch 后边的 表达式 的结果不是整形常量1 ,也不是整形常量2 的时候,就会执行default 语句。
也就是说default语句是处case语句以外的结果
就比如:前面做的打印星期的练习,如果 day 的输入不是1~7的值,如果我们要提示:输入错误,则可以这样完成代码:
#include <stdio.h> int main() { int day = 0; scanf("%d", &day); switch (day) { case 1: case 2: case 3: case 4: case 5: printf("⼯作⽇\n"); break; case 6: case 7: printf("休息⽇\n"); break; default: printf("输⼊错误\n"); break; } return 0; }
switch语句中的case和default的顺序问题
在 switch 语句中 case 子句和 default 子句有要求顺序吗? default 只能放在最后吗?
其实,在 switch 语句中 case 语句和 default 语句是没有顺序要求的,只要你的顺序是满足实际需求的就可以。不过我们通常是把 default 子句放在最后处理的
我们也可以理解为:switch表达式的结果为5时就是从case 5开始,因此无论我们把case5与其他case语句以及default语句交换顺序时,都是从case5开始。
while语句
C语言提供了3种循环语句, while 就是其中⼀种,接下来就介绍⼀下 while 语句。
while 语句的语法结构和 if 语句非常相似。
我们将if语句以及while语句进行对比:
if(表达式) 语句; while(表达式) 语句;//如果循环体想包含更多的语句,可以加上⼤括号
具体代码如下:
//代码1 #include <stdio.h> int main() { if (1) printf("快关注点赞\n"); //if后边条件满⾜,打印⼀次快关注点赞 return 0; } //代码2 #include <stdio.h> int main() { while (1) printf("快关注点赞\n"); //while后边的条件满⾜,死循环的打印快关注点赞 return 0; }
while语句的执行流程
⾸先上来就是执行判断表达式,表达式的值为0,循环直接结束;表达式的值不为0,则执行循环语
句,语句执行完后再继续判断,是否进行下⼀次判断
while语句的具体例子
//例子1 在屏幕上打印1~10的值 #include <stdio.h> int main() { int i = 1; while (i <= 10) { printf("%d ", i); i = i + 1; } return 0; } //例子2 输⼊⼀个正的整数,逆序打印这个整数的每⼀位 例如: 输⼊:1234,输出:4 3 2 1 输⼊:521,输出:1 2 5 #include <stdio.h> int main() { int n = 0; scanf("%d", &n); while (n) { printf("%d ", n % 10); n /= 10; } return 0; } /* 1.要想得到n的最低位,可以使⽤n%10的运算,得到的余数就是最低位,如:1234%10得到4 2. 要想去掉n的最低位,找出倒数第⼆位,则使⽤ n=n/10 操作就可以去掉最低位的,如: n=1234/10得到123,123相较于1234就去掉了最低位,123%10就得到倒数第二位3。 3. 循环1和2两个步骤,在n变成0之前,就能到所有的位*/