爲何sizeof(x ++)不增長x?

這是在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;
}

我但願在執行註釋1x爲6。 可是,輸出爲: app

4 and 5

誰能解釋爲何音符1以後x不會增長? 函數


#1樓

sizeof()運算符僅給出數據類型的大小,它不評估內部元素。 this


#2樓

注意 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++] )

#3樓

sizeof在編譯時運行,可是x++只能在運行時評估。 爲了解決這個問題,C ++標準規定不對sizeof的操做數求值(VLA除外)。 C標準說:

若是[ sizeof ]的操做數的sizeof是可變長度數組類型,則對操做數求值; 不然,不評估操做數,結果爲整數常量。


#4樓

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做爲輸出。


#5樓

來自C99標準 (重點是個人)

6.5.3.4/2

sizeof運算符產生其操做數的大小(以字節爲單位),該操做數能夠是表達式或類型的括號名稱。 大小由操做數的類型肯定。 結果是一個整數。 若是操做數的類型是可變長度數組類型,則對操做數求值; 不然, 不評估操做數 ,結果爲整數常量。

相關文章
相關標籤/搜索