switch语句与default子句顺序导致的问题汇编解释

 调程序时发现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

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HsiaoShawn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值