2012-07-16 45 views
8

在GNUC C中,您可以使用typeof(expression),並且在內部使用帶有副作用的表達式是合法的。因此,例如,你可以有這樣的C代碼:typeof()表達式中的副作用

int x = 0; 
typeof(x++) y; 

在這種情況下,副作用被忽略,X仍然是零之後(這是有道理的類型是一個編譯時間嘛)。

然而,GCC documentation說:

typeof運算的操作數爲它的副作用 當且僅當它是可變類型 的表達或該類型的名稱進行了評價。

這句話是什麼意思?是否真的有可能編寫typeof帶來副作用,並且實際上在運行時會執行副作用?對我而言,這句話似乎表明了這一點。

+0

http://stackoverflow.com/q/4436889/195488 – 2012-07-16 12:52:44

+1

@ 0A0D這個問題也談到'typeof',但沒有提到副作用,只有副作用的表達式。 – 2012-07-16 12:55:09

+0

@PhilippWendler:好問題! – pje 2012-10-12 03:28:51

回答

9

是的,在某些情況下可能會對typeof中的副作用進行評估。正如文件所述,它需要處於「可變更改類型」之內。這是一種取決於某些運行時值的類型,如int[x]

所以下面的代碼是合法的,y聲明爲int[1]類型的,並且x的值爲1算賬:

int x = 0; 
typeof(int[++x]) y; 

當然,在一般同樣可變地修改類型,這僅僅是合法的局部變量聲明(內部函數)。

+3

請注意,這與'sizeof'相同:除非出現可變長度數組並且數組大小的值影響'sizeof'表達式的結果,否則不會計算表達式操作數。 – ouah 2012-07-16 12:52:30

相關問題