问题背景:
switch语句被引入C语言中,以方便根据表达式的值在多个分支之间分配控制。这是一个大型if-else链的替代方案,广泛应用于处理命令、状态和枚举值。
问题:
switch语句的主要危险在于遗忘了break语句、意外地发生了"fallthrough"、在块内声明的变量造成的复杂性,以及表达式的类型必须是整数。
解决方案:
为了安全使用:
代码示例:
#include <stdio.h> void print_day(int day) { switch (day) { case 1: printf("Monday "); break; case 2: printf("Tuesday "); break; case 3: printf("Wednesday "); break; case 4: printf("Thursday "); break; case 5: printf("Friday "); break; case 6: case 7: printf("Weekend "); break; default: printf("Unknown day "); } }
关键特点:
可以在switch表达式中使用float类型吗?
不可以。C语言标准要求switch表达式必须是整型或可转换为整型的类型(char、short、int、long、enum等)。
如果交换case的位置,顺序会影响逻辑吗?
switch中case的声明顺序不会影响找到所需值的过程。代码从匹配的case开始执行,直到第一个break。但在没有break(fallthrough)的情况下顺序是有影响的。
可以在没有大括号的case中声明变量吗?
不可以。如果在case之后声明变量而没有额外的{}块,会导致编译错误。正确的方式是:
switch (x) { case 1: { int y = 0; break; } }
在一个大型项目中,程序员在一个case后忘记了break,因此误执行了多个分支。这个bug只被用户发现。
优点:
缺点:
在需要fallthrough的情况下,使用注释标记的fallthrough进行说明,所有关键的case都有break或return,default中输出警告。
优点:
缺点: