设为首页 加入收藏

TOP

5.4 switch的真相(1)
2013-10-07 14:30:12 来源: 作者: 【 】 浏览:69
Tags:5.4 switch 真相

5.4 switch的真相(1)

switch是比较常用的多分支结构,使用起来也非常方便,并且效率上也高于if…else if多分支结构。同样是多分支结构,switch是如何进行比较并选择分支的?它和if…else if的处理过程一样吗?下面我们通过简单的switch多分支结构慢慢揭开它的神秘面纱。编写case语句块不超过3条的switch多分支结构,如代码清单5-8所示。

代码清单5-8 switch 转换if else的 C++(www.cppentry.com)代码

  1. //略去无关代码  
  2. int nIndex = 1;  
  3. scanf("%d", &nIndex);  
  4. switch(nIndex) {  
  5. case 1: printf("nIndex == 1");  break;  
  6. case 3: printf("nIndex == 3");  break;  
  7. case 100: printf("nIndex == 100")   ;break;  

代码清单5-8中的case语句块只有3条,也就是只有3条分支。if…else if的处理方案是分别进行比较,得到选择的分支,并跳转到分支语句块中。switch也会使用同样的方法进行分支处理吗?下面通过代码清单5-9进行分析和验证。

代码清单5-9 switch 转换if else —Debug版

  1. switch(nIndex) {                // 源码对比  
  2. 0040DF00    mov     ecx,dword ptr [ebp-4]  
  3. ; 取出变量nIndex的值并放到ecx中,再将ecx放入临时变量 ebp - 8中  
  4. 0040DF03    mov     dword ptr [ebp-8],ecx  
  5. ; 将临时变量和1进行比较  
  6. 0040DF06    cmp     dword ptr [ebp-8],1  
  7. ; 条件跳转比较,等于1则跳转到地址0x0040DF1A处  
  8. 0040DF0A    je      SwitchIf+4Ah (0040df1a)  
  9. ; 将临时变量和3比较  
  10. 0040DF0C    cmp     dword ptr [ebp-8],3  
  11. ; 条件跳转比较,等于3则跳转到地址0x0040DF29处  
  12. 0040DF10    je          SwitchIf+59h (0040df29)  
  13. ; 将临时变量和100比较  
  14. 0040DF12    cmp     dword ptr [ebp-8],64h  
  15. ; 条件跳转比较,等于100则跳转到地址0x0040DF38处  
  16. 0040DF16    je      SwitchIf+68h (0040df38)  
  17. 0040DF18    jmp     SwitchIf+75h (0040df45)  
  18. case 1:                 // 源码对比  
  19. printf("nIndex == 1");      // 源码对比  
  20. 0040DF1A   push     offset string "nIndex == 1" (00421024)  
  21. 0040DF1F   call         printf (004014b0)  
  22. 0040DF24   add      esp,4  
  23. break;                          // 源码对比  
  24. 0040DF27   jmp      SwitchIf+75h (0040df45)  
  25. case 3:                     // 源码对比  
  26. printf("nIndex == 3");      // 源码对比  
  27. 0040DF29   push     offset string "nIndex == 3" (004210d8)  
  28. 0040DF2E   call         printf (004014b0)  
  29. 0040DF33   add      esp,4  
  30. break;                          // 源码对比  
  31. 0040DF36   jmp      SwitchIf+75h (0040df45)  
  32. case 100:                       // 源码对比  
  33. printf("nIndex == 100");    // 源码对比  
  34. 0040DF38   push        offset string "nIndex == 100" (0042004c)  
  35. 0040DF3D   call        printf (004014b0)  
  36. 0040DF42   add         esp,4  
  37. break; }}                       // 源码对比  
  38. 0040DF45   pop         edi 


从对代码清单5-9的分析中得出,switch语句使用了3次条件跳转指令,分别与1、3、100进行了比较。如果比较条件成立,则跳转到对应的语句块中。这种结构与if…else if多分支结构非常相似,但仔细分析后发现,它们之间有很大的区别。先看看if…else if结构产生的代码,如代码清单5-10所示。

代码清单5-10 if…else if结构—Debug版

  1. if (nIndex == 1) {              // 源码对比  
  2.  
  3. ; if比较跳转    
  4. 004011C5        cmp     dword ptr [ebp-4],1  
  5. 004011C9        jne     SwitchIf+8Ah (004011da)   
  6. printf("nIndex ==  1");         // 源码对比  
  7. ; if语句块  
  8. 004011CB        push    offset string "nIndex ==  1" (00423080)  
  9. 004011D0        call    printf (00401680)  
  10. 004011D5        add     esp,4  
  11. }else if (nIndex == 3)          // 源码对比  
  12. ; else跳转  
  13. 004011D8        jmp     SwitchIf+0B2h (00401202)  
  14. ; if比较跳转  
  15. 004011DA        cmp     dword ptr [ebp-4],3  
  16. 004011DE        jne     SwitchIf+9Fh (004011ef)  
  17. {printf("nIndex == 3");         // 源码对比  
  18. ; if语句块  
  19. 004011E0        push    offset string "nIndex == 3" (0042304c)  
  20. 004011E5        call    printf (00401680)  
  21. 004011EA        add     esp,4  
  22. }else if (nIndex == 3)          // 源码对比  
  23. ; else 跳转  
  24. 004011ED        jmp     SwitchIf+0B2h (00401202)  
  25. ; if比较跳转  
  26. 004011EF        cmp     dword ptr [ebp-4],3  
  27. 004011F3        jne     SwitchIf+0B2h (00401202)  
  28. { printf("nIndex == 100");      // 源码对比  
  29. ; if语句块  
  30. 004011F5        push    offset string "nIndex == 100" (00423090)  
  31. 004011FA        call    printf (00401680)  
  32. 004011FF        add     esp,4  
  33. }  
  34.                             // 结尾 

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇5.4 switch的真相(2) 下一篇5.7 do/while/for的比较(1)

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: