1 回答
TA贡献1798条经验 获得超3个赞
我们可以直接通过汇编代码来看:
void bob()
{
int a = 1;
switch(a)
{
case 1:
std::cout<<"case 1"<<std::endl; break;
case 2:
std::cout<<"case 2"<<std::endl; break;
case 3:
std::cout<<"case 3"<<std::endl; break;
default:
std::cout<<"default case"<<std::endl;
}
}
汇编其中关键代码如下:可以看到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+0x3f>
//否则,继续比较是否等于3,
40085d:>..83 f8 03 >..cmp $0x3,%eax
400860:>..74 41 >..je 4008a3 <_Z3bobv+0x5d>
//最后比较是否等于1
400862:>..83 f8 01 >..cmp $0x1,%eax
400865:>..75 5a >..jne 4008c1 <_Z3bobv+0x7b>
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@plt>
400883:>..eb 58 >..jmp 4008dd <_Z3bobv+0x97>
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@plt>
4008a1:>..eb 3a >..jmp 4008dd <_Z3bobv+0x97>
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@plt>
4008bf:>..eb 1c >..jmp 4008dd <_Z3bobv+0x97>
4008c1:>..be e2 09 40 00 >..mov $0x4009e2,%esi
40092c: c9 leaveq
40092d: c3 retq
至于为什么是这个顺序,没有研究过,这是编译器层面的处理了,可以一起学习下,
添加回答
举报