前言:
其實說來慚愧阿XD
都已經大肆了卻現在才真正理解先後++的差別在哪裡
前幾天跟同學聊天才聊到這個才去了解的XD
我想先說一下差別
兩個運算的差別就在先取值或是先賦值!
不過沒這麼簡單的,今天想要說的是一些平常別人沒提到的更複雜一點的Case!
畢竟這是一個很多人都討論過的題目了(也是很多公司的基本面試題!!)
所以今天就講深一點讓讓大家知道多一些吧!
正文講解 + 舉例
在一開始
我用一段小小的程式碼舉例好了
在這兩行程式碼當中很明顯
在這兩行程式碼當中很明顯可以看到根本沒差!
因為在這裡沒有賻值的問題
但是在下一張就可以看出來差別了
在這裡可以看到 C和D的值不一樣,原因是這樣的
C++ 會從左邊往右邊看,所以在宣告C的時候他看到等號右邊是A所以就先把A的值(2)拿出來放到C裡面了。
而在宣告D的時候他看到等號右邊發現竟然是+號,所以就把 ++B計算出來(也就是B = B + 1)然後再放入D中,所以才會導致 C 和 D不同。
那這邊我來考考大家吧~
底下這兩個 AA 和 BB 倒底會是多少呢~~?
要公布解答囉!
AA 是 6!
BB 是 8!
驚不驚喜! 意不意外!!
沒錯 很多人可能會以為 AA = (A++) + (++A) 這一行會因為剛剛提到的順序所以就自動把這一行看成 AA = A[因為先取值,取到一開始的2] + (++A)[因為先加一後取值,取到3] 所以會是 5 對吧!
但是 這邊要講一下
這個問題其實很多人討論過了,會造成答案不一樣的原因就是編譯後組語的順序問題我來貼一下剛剛那兩段反組譯後的組語吧!
A
這樣短短的一行在 Visual Studio 裡面會被翻譯成這樣的組語,我們可以從第一到三行(作用就是 ++A 這一段指令完成::[A的值拿出來加一後再放回A])而第四行就是A++的取值部分動作,第五行的add就是將兩個值相加了第六行的mov就是把計算完成的值放入AA裡面!第七行到第八行就是完成A++剩下的加一的動作!
組語指令解釋:
♠ dword = 2 word = 4 Bytes = 32 bits 就是 int 型態啦!
指令 | 參數一 | 參數二 | 翻譯 |
---|---|---|---|
mov | eax | dword ptr [變數名稱] | 把 從 [變數] 開始的 dword大小的值提出來放入eax暫存器中 |
add | eax | 1 | 將eax暫存器的值加一 |
mov | dword | pt [變數]eax | 把 eax暫存器的值提出來放入 [變數] 開始的dword大小的記憶體中 |
所以可以從這裡發現兩件事
- A++ 後序式的++式將++放到整個指令的最後面。整個加法的順序是由後面加到前面的
根據不同的編譯器 compile 出來的組語都會有一些些的不同,不過大致上的概念都是一樣的,大家有興趣的話也可以用其他的 compiler 試試看,如果有甚麼驚奇的發現的話也可以在下面跟大家分享喔~那下面就放B的組語和更複雜的範例讓大家練習看看吧~
留言解答我再來和你們公布喔XD不管是甚麼想法都可以在底下留言喔! 那我們下一篇再見啦!ㄅㄅ
B
CC