switch语句的工作原理

本文深入剖析了C++中switch语句的工作机制,通过示例代码展示了其如何将case标签地址存储并利用flag值进行跳转。通过对汇编代码的分析,揭示了switch语句本质上的整型变量依赖性,即通过计算flag值来确定执行路径。这表明switch语句适用于根据整型变量执行不同指令的场景。

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

提出问题:
  • 为什么swittch语句只能判断整型类型的变量?
C++
  void main(){
	  int flag;
	  flag = 20;
	  switch (flag)
	  {
	      case 1:
	        printf("1\n");
	        break;
	      case 2:
	        printf("2\n");
	        break;
	      case 3:
	        printf("3\n");
	        break;
	      case 4:
	        printf("4\n");
	        break;
	      case 5:
	        printf("5\n");
	        break;
	      default:
	        printf("%d\n", flag);
	  }
}​​
汇编
 mov         dword ptr [ebp-8],14h  

mov         eax,dword ptr [ebp-8]  
mov         dword ptr [ebp-4],eax  
mov         ecx,dword ptr [ebp-4]  
sub         ecx,1  
mov         dword ptr [ebp-4],ecx  
cmp         dword ptr [ebp-4],4  
ja          009A10F7  
mov         edx,dword ptr [ebp-4]  
jmp         dword ptr [edx*4+009A1110h]
    
 push        45DD58h  
 call        0045163B  
 add         esp,4  
 jmp         004547F9    
     
 push        45DD60h  
 call        0045163B  
 add         esp,4   
 jmp         004547F9      
      
 push        45DD6Ch  
 call        0045163B  
 add         esp,4     
 jmp         004547F9    
      
 push        45DF88h  
 call        0045163B  
 add         esp,4  
 jmp         004547F9    
     
 push        45DB40h  
 call        0045163B  
 add         esp,4  
 jmp         004547F9  
  
 mov         eax,dword ptr [ebp-8]  
 push        eax  
 push        45DB58h  
 call        0045163B  
 add         esp,8
机器码
00454768 C7 45 F8 14 00 00 00  

0045476F 8B 45 F8              
00454772 89 85 30 FF FF FF    
00454778 8B 8D 30 FF FF FF   
0045477E 83 E9 01             
00454781 89 8D 30 FF FF FF   
00454787 83 BD 30 FF FF FF 04  
0045478E 77 58                
00454790 8B 95 30 FF FF FF   
00454796 FF 24 95 10 48 45 00 

0045479D 68 58 DD 45 00       
004547A2 E8 94 CE FF FF      
004547A7 83 C4 04            
   
004547AA EB 4D                
  
004547AC 68 60 DD 45 00       
004547B1 E8 85 CE FF FF       
004547B6 83 C4 04            
      
004547B9 EB 3E               
    
004547BB 68 6C DD 45 00      
004547C0 E8 76 CE FF FF      
004547C5 83 C4 04           
       
004547C8 EB 2F               
   
004547CA 68 88 DF 45 00      
004547CF E8 67 CE FF FF      
004547D4 83 C4 04             
    
004547D7 EB 20                
  
004547D9 68 40 DB 45 00       
004547DE E8 58 CE FF FF       
004547E3 83 C4 04             
  
004547E6 EB 11               

004547E8 8B 45 F8            
004547EB 50                   
004547EC 68 58 DB 45 00       
004547F1 E8 45 CE FF FF      
004547F6 83 C4 08            
分析汇编:

具体值代入法:

  1. flag = 1, flag = flag - 1 flag<=4, 执行jmp指令,地址:flag*4+005C1110h = 005C1110h
  2. flag = 2, flag = flag - 1 flag<=4, 执行jmp指令,地址:flag*4+005C1110h = 005C1114h
  3. flag = 3, flag = flag - 1 flag<=4, 执行jmp指令,地址:flag*4+005C1110h = 005C1118h
  4. flag = 4, flag = flag - 1 flag<=4, 执行jmp指令,地址:flag*4+005C1110h = 005C111ch
  5. flag = 5, flag = flag - 1 flag<=4, 执行ja指令,地址:004547E8h
发现规律:switch语句的本质是把case的每一个地址存储在一个数组里,然后flag经过计算得出存储该地址的数组下标。
应用场景

内存里的某个整型变量根据不同的要执行不同的指令

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小鸡岛~

你的支持是我更新的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值