c语言case跳转,switch case的跳转原理?

本文解析了一段汇编代码,揭示了`switch`语句中case标签比较的非直观顺序,并探讨了编译器处理背后的逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们可以直接通过汇编代码来看:

void bob()

{

int a = 1;

switch(a)

{

case 1:

std::cout<

case 2:

std::cout<

case 3:

std::cout<

default:

std::cout<

}

}

汇编其中关键代码如下:可以看到case实际的比较顺序是2->3->1, 并不是代码的编写顺序:

0000000000400846 <_z3bobv>:

400846:>..55                   >..push   %rbp

400847:>..48 89 e5             >..mov    %rsp,%rbp

40084a:>..48 83 ec 10          >..sub    $0x10,%rsp

40084e:>..c7 45 fc 01 00 00 00 >..movl   $0x1,-0x4(%rbp)

400855:>..8b 45 fc             >..mov    -0x4(%rbp),%eax

//先比较是否等于2, 如果是,则跳转到0x400885指令地址, 即case的输出语句;

400858:>..83 f8 02             >..cmp    $0x2,%eax

40085b:>..74 28                >..je     400885 <_z3bobv>

//否则,继续比较是否等于3,

40085d:>..83 f8 03             >..cmp    $0x3,%eax

400860:>..74 41                >..je     4008a3 <_z3bobv>

//最后比较是否等于1

400862:>..83 f8 01             >..cmp    $0x1,%eax

400865:>..75 5a                >..jne    4008c1 <_z3bobv>

400867:>..be d4 09 40 00       >..mov    $0x4009d4,%esi

40086c:>..bf 60 10 60 00       >..mov    $0x601060,%edi

400871:>..e8 9a fe ff ff       >..callq  400710 <_zstlsist11char_traitsiceerst13basic_ostreamict_>

400876:>..be 30 07 40 00       >..mov    $0x400730,%esi

40087b:>..48 89 c7             >..mov    %rax,%rdi

40087e:>..e8 9d fe ff ff       >..callq  400720 <_znsolsepfrsos_e>

400883:>..eb 58                >..jmp    4008dd <_z3bobv>

400885:>..be db 09 40 00       >..mov    $0x4009db,%esi

40088a:>..bf 60 10 60 00       >..mov    $0x601060,%edi

40088f:>..e8 7c fe ff ff       >..callq  400710 <_zstlsist11char_traitsiceerst13basic_ostreamict_>

400894:>..be 30 07 40 00       >..mov    $0x400730,%esi

400899:>..48 89 c7             >..mov    %rax,%rdi

40089c:>..e8 7f fe ff ff       >..callq  400720 <_znsolsepfrsos_e>

4008a1:>..eb 3a                >..jmp    4008dd <_z3bobv>

4008a3:>..be db 09 40 00       >..mov    $0x4009db,%esi

4008a8:>..bf 60 10 60 00       >..mov    $0x601060,%edi

4008ad:>..e8 5e fe ff ff       >..callq  400710 <_zstlsist11char_traitsiceerst13basic_ostreamict_>

4008b2:>..be 30 07 40 00       >..mov    $0x400730,%esi

4008b7:>..48 89 c7             >..mov    %rax,%rdi

4008ba:>..e8 61 fe ff ff       >..callq  400720 <_znsolsepfrsos_e>

4008bf:>..eb 1c                >..jmp    4008dd <_z3bobv>

4008c1:>..be e2 09 40 00       >..mov    $0x4009e2,%esi

40092c:       c9                      leaveq

40092d:       c3                      retq

至于为什么是这个顺序,没有研究过,这是编译器层面的处理了,可以一起学习下,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值