<acronym id="xonnx"></acronym>
      <td id="xonnx"></td>
    1. <pre id="xonnx"></pre>

      1. 專注電子技術學習與研究
        當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

        最好不要寫這樣的代碼: n=(++i)+(++i); n=(++i)+(++i)+(++i);

        作者:佚名   來源:本站原創   點擊數:  更新時間:2014年08月16日   【字體:

         不要寫如下類型的代碼: 

        n=(++i)+(++i); 
        n=(++i)+(++i)+(++i);
         
         
        看看匯編就知道為什么了:
         
        n=(++i)+(++i);的匯編 (i=5) :
         
        00401090 mov ecx,dword ptr [ebp-8] 
        00401093 add ecx,1
         
        00401096 mov dword ptr [ebp-8],ecx 完成 i 自加1
         
        00401099 mov edx,dword ptr [ebp-8] 結果放入edx
         
        0040109C add edx,1
         
        0040109F mov dword ptr [ebp-8],edx 完成第二次 i 自加1
         
        004010A2 mov eax,dword ptr [ebp-8] 1 結果放入eax
         
        004010A5 add eax,dword ptr [ebp-8] 2 eax <-- eax+i
         
        004010A8 mov dword ptr [ebp-4],eax 3
         
        看看最后3行代碼:1-->把 i 的值放入寄存器eax,
        2-->把 i 的值和eax相加,這就是相當于 i + i 了
         
        3-->把eax的結果放入n中
         
        結果就是n=i+i,而且 i 是經過兩次自加后的終值。
         
        所以 i 經過兩次自加后 i = 7 ,n=7+7=14,而不是我們想象的 n = 6+7。
         
        而且在不同的編譯器、不同的CPU的情況下,處理方式恐怕都會不同。
         
         
         
        再看 n=(++i)+(++i)+(++i); 的匯編 (i=5) :
         
        00401090 mov ecx,dword ptr [ebp-8]
         
        00401093 add ecx,1
         
        00401096 mov dword ptr [ebp-8],ecx 完成第一次 i 自加1
         
        00401099 mov edx,dword ptr [ebp-8] 結果放入edx
         
        0040109C add edx,1
         
        0040109F mov dword ptr [ebp-8],edx 完成第二次 i 自加1
         
        004010A2 mov eax,dword ptr [ebp-8] 結果放入eax
         
        004010A5 add eax,dword ptr [ebp-8] eax <-- eax+i (eax= i + i)
         
        004010A8 mov ecx,dword ptr [ebp-8] 結果放入ecx (ecx=i+i)
         
        004010AB add ecx,1
         
        004010AE mov dword ptr [ebp-8],ecx 完成第三次 i 自加1
         
        004010B1 add eax,dword ptr [ebp-8] eax <-- eax+i
         
        004010B4 mov dword ptr [ebp-4],eax 結果放入n
         
        前8句代碼和n=(++i)+(++i);一樣、結果為14、這個值放入eax和ecx中、i=7
        然后 i 自加1、i=8 --> eax= eax+i =14+8=22
         
        一般認為n=6+7+8=21、但是過程和我們的習慣想法不同。
         
        使用picc(PIC單片機的編譯器)編譯的結果和過程和VC++6.0一樣。
         
        這樣的代碼和我們思考的習慣相差較大、不用為宜。
         
        當然、類似n=(i++)+(++i);之類的代碼也不宜出現,除非你對過程很熟悉、
         
        或者你愿意經常為了這幾句代碼去查看具體的執行過程。
         
         
        VC++6.0查看匯編:
         
        F10進入調試、view菜單里面的反匯編選項:view/debug window/diss.../ 
        關閉窗口

        相關文章

        欧美性色欧美精品视频,99热这里只有精品mp4,日韩高清亚洲日韩精品一区二区,2020国自产拍精品高潮