這是在dev c ++窗口中編譯的代碼: 數組
#include <stdio.h> int main() { int x = 5; printf("%d and ", sizeof(x++)); // note 1 printf("%d\n", x); // note 2 return 0; }
我但願在執行註釋1後x
爲6。 可是,輸出爲: app
4 and 5
誰能解釋爲何音符1以後x
不會增長? 函數
sizeof()
運算符僅給出數據類型的大小,它不評估內部元素。 this
注意 spa
此答案是從重複副本中合併而成的,這解釋了延遲日期。 rest
原版的 code
除了可變長度數組, sizeof不會評估其參數。 咱們能夠從C99標準草案第6.5.3.4
節「 sizeof運算符第2段」中看到這一點: get
sizeof運算符產生其操做數的大小(以字節爲單位),該操做數能夠是表達式或類型的括號名稱。 大小由操做數的類型肯定。 結果是一個整數。 若是操做數的類型是可變長度數組類型,則對操做數求值; 不然,不評估操做數,結果爲整數常量。 io
一個註釋( 現已刪除 )詢問這樣的事情是否會在運行時評估: 編譯
sizeof( char[x++] ) ;
確實能夠,像這樣的東西也能夠工做( 看到他們兩個都活着 ):
sizeof( char[func()] ) ;
由於它們都是可變長度數組。 雖然,我都沒有發現任何實際用途。
注意,可變長度數組在C99標準草案第6.7.5.2
節「 數組聲明器」第4節中進行了介紹 :
[...]若是大小是整數常量表達式,而且元素類型具備已知的常量大小,則數組類型不是可變長度數組類型; 不然,數組類型爲可變長度數組類型。
更新資料
在C11中,答案針對VLA狀況而改變,在某些狀況下,不肯定是否評估大小表達式。 從6.7.6.2
節的數組聲明 6.7.6.2
:
若是大小表達式是sizeof運算符的操做數的一部分,而且更改大小表達式的值不會影響該運算符的結果,則不肯定是否評估該大小表達式。
例如,在這種狀況下( 現場觀看 ):
sizeof( int (*)[x++] )
sizeof
在編譯時運行,可是x++
只能在運行時評估。 爲了解決這個問題,C ++標準規定不對sizeof
的操做數求值(VLA除外)。 C標準說:
若是[
sizeof
]的操做數的sizeof
是可變長度數組類型,則對操做數求值; 不然,不評估操做數,結果爲整數常量。
sizeof
是一個編譯 sizeof
算符 ,所以在編譯時sizeof
及其操做數將被結果值替換。 徹底不評估操做數(除非它是可變長度數組); 僅結果的類型很重要。
short func(short x) { // this function never gets called !! printf("%d", x); // this print never happens return x; } int main() { printf("%d", sizeof(func(3))); // all that matters to sizeof is the // return type of the function. return 0; }
輸出:
2
由於short
在個人機器上佔用2個字節。
將函數的返回類型更改成double
:
double func(short x) { // rest all same
將給出8
做爲輸出。
來自C99標準 (重點是個人)
6.5.3.4/2
sizeof運算符產生其操做數的大小(以字節爲單位),該操做數能夠是表達式或類型的括號名稱。 大小由操做數的類型肯定。 結果是一個整數。 若是操做數的類型是可變長度數組類型,則對操做數求值; 不然, 不評估操做數 ,結果爲整數常量。