甘肅網(wǎng)站建設seo策略什么意思
????????這好像是一個哲學問題。
目錄
前言
一、順序點是什么?
二、發(fā)生有關(guān)順序點的問題代碼
vs中:
gcc中:
三、細讀匯編
1.vs匯編如下(示例):
2.gcc匯編如下(示例):
四、理解匯編
圖解
原因:?
?五、如果是a = (++a) + (++a)呢?
1.vs匯編:
?2.圖解:
總結(jié)
前言
? ? ?????????一旦執(zhí)行到一個順序點,此前的副作用都必須生效。
一、順序點是什么?
????????順序點,也稱作序列點,是計算機程序中一些執(zhí)行點,在該點處之前的求值的所有的副作用已經(jīng)發(fā)生,在它之后的求值的所有副作用仍未開始。在C與C++程序設計語言中,表達式的值依賴于它的子表達式的求值順序。增加更多的順序點限制了可能的求值順序,能保證有一個一致結(jié)果。(來源:百度百科)
二、發(fā)生有關(guān)順序點的問題代碼
代碼如下(示例):
#include <stdio.h>int main()
{int a = 0;a = (a++) + (++a);printf("%d", a);return 0;
}
? ? ? ? ?a++的副作用是將a增加了a,按照以往的常識是在這句話結(jié)束后才會產(chǎn)生此副作用,但是這時表達式左邊也是a,a到底是在這句話結(jié)束后才產(chǎn)生的副作用還是一邊向后執(zhí)行,一邊產(chǎn)生副作用?(哲學嗎)
? ? ? ? 這個就取決于編譯器了,這也正是這段代碼的問題所在。
vs中:
gcc中:
三、細讀匯編
1.vs匯編如下(示例):
2.gcc匯編如下(示例):
四、理解匯編
? ? ? ? 匯編的人話版就是:
? ? ? ? ①前置++優(yōu)先級略高于后置++,先算前置的,????????
? ? ? ? ②算出來以后因為表達式左邊也有a,前置++這個式子對于其有副作用,就去更新左值a,a = 1
? ? ? ? ③更新好后,再來計算a++
? ? ? ? ④因為后置++是先賦值后計算,所以在后置++中,a是前置++算出來以后的值,所以計算后置++后,a沒有發(fā)生變化,不用更新a(a = 1)
? ? ? ? ⑤兩個++都算完以后,該算“+”了,此時計算的式子是:1+1 = 2;2是表達式右邊的值,其等于表達式左邊,左邊是a,所以此時a = 2
? ? ? ? ⑥此時該后置++運算了,取得a的最新值為2,進行++,得到a的最終值是3。
圖解
原因:?
? ? ? ? 所以,當有副作用式子出現(xiàn)時,如果還寫了一段問題代碼,那么這個時候就需要看編譯器對于順序點前后的處理方式,vs與gcc也正是因此而產(chǎn)生的不同答案。
?五、如果是a = (++a) + (++a)呢?
? ? ? ? 與四分析方式相同,結(jié)論是:
? ? ? ? 先算出所有的副作用帶來的影響(++),再計算沒有副作用的式子(+)。
1.vs匯編:
?2.圖解:
總結(jié)
- 表達式如果不能通過操作符的屬性確定唯一的計算路徑,表達式就是存在問題的。
- 盡量少寫產(chǎn)生順序點疑問的代碼。