调程序时发现switch语句的一个奇怪的情况,default语句前置于case语句没有break导致程序会执行完default语句后跳过case语句,继续执行后续程序,直到遇到break才会跳出switch语句,在这里分析一下。
这是因为在这种情况下,switch语句会先跳过default与case语句条件匹配,如果没有匹配才会执行前置的default,然而由于default后没有break的话,就会出现执行完default语句后跳过后续case语句,继续执行后续程序,直到遇到break才会跳出switch语句,出现这种情况的根本原因是switch语句只进行第一次条件检查,匹配完成或者没有匹配执行default语句后,不再对case进行条件匹配,从而出现继续执行后续程序,直到遇到break才会跳出switch语句,所以除非程序逻辑需要这种结构,否则应该在前置default后添加break,或者后置default。
#include <stdio.h>
#define prn(s) printf("Type int is simular with %s.\n", s);
int main() {
switch (1)
printf("switch statement executed.\n");
long x;
switch (sizeof(int)) {
default:
x = sizeof(int);
prn("other type");
//break;
case sizeof(short int):
x = sizeof(int);
x = sizeof(short int);
prn("short int");
break;
case sizeof(long int):
prn("long int");
break;
}
}
.LC0:
.string "other type"
.LC1:
.string "Type int is simular with %s.\n"
.LC2:
.string "short int"
main:
push rbp
mov rbp, rsp
sub rsp, 16
mov QWORD PTR [rbp-8], 4
mov esi, OFFSET FLAT:.LC0
mov edi, OFFSET FLAT:.LC1
mov eax, 0
call printf
mov QWORD PTR [rbp-8], 4
mov QWORD PTR [rbp-8], 2
mov esi, OFFSET FLAT:.LC2
mov edi, OFFSET FLAT:.LC1
mov eax, 0
call printf
nop
mov eax, 0
leave
ret