2013-05-19 83 views
4

當我寫這個的C代碼,我隨口編碼:後增量運算用C

#include <stdio.h> 
int main() 
{ 
    int i; 
    i = 10; 
    printf("i : %d\n",i); 
    printf("sizeof(i++) is: %d\n",sizeof(i++)); 
    printf("i : %d\n",i); 
    return 0; 
} 

而且,當我跑的代碼,結果我得到的是,

i : 10 
sizeof(i++) is: 4 
i : 10 

我百思不得其解通過這個結果,因爲我期望i ++內的sizeof運算符增加i。但似乎不是。因此,出於好奇,我寫了下面的程序:

#include <stdio.h> 
int add(int i) 
{ 
    int a = i + 2; 
    return 4; 
} 
int main() 
{ 
    int i; 
    i = 10; 
    printf("i : %d\n",i); 
    printf("sizeof(i++) is: %d\n",add(i++)); 
    printf("i : %d\n",i); 
    return 0; 
} 

這個程序,輸出是:

i : 10 
sizeof(i++) is: 4 
i : 11 

現在我越來越困惑。

對不起,如果這是一個noob問題(我是),但我真的不明白,即使如何谷歌這樣的問題!

爲什麼我在這兩個程序中的價值不同?請幫忙!

+0

@ ring0我在Windows上運行gcc 4.6.3在Windows 12.04虛擬機之上。 – user2290802

回答

5

sizeof()不是運行時功能。它只是給你一個函數的變量的大小或返回值的大小。

所以在第一個例子中,你只是得到一個後置增量運算符的結果值的大小,該整數是一個整數... 4個字節。

在你的榜樣,你只是打印您的方法,它返回4,然後變量遞增的返回值,您打印11

+1

我不關心sizeof()返回的內容。我關注最後的prinf()。後增量後,我期望x的值爲11.但與sizeof()的例子仍然有10作爲最終值。但是當我用另一個函數替換sizeof()時,x的最終值是11.這是我的擔心。 – user2290802

+1

仍然回答你的問題。預處理器/編譯器將'sizeof(i ++)'替換爲'4',所以'i ++'永遠不會成爲可執行文件中的機器代碼。 –

+1

@ user2290802這就是我所說的,sizeof()不是一個運行時函數。在編譯時它只看到參數的大小,並將該數字插入其位置(有點)。在運行時,i ++甚至不存在,所以它不評估。 –

5

sizeof不計算它的操作數(除VLA型的情況下)。

這意味着sizeof(*(T*)(NULL))sizeof(T)相同,並且完全有效。

+1

+1這是正確的答案。在C99標準中,這是第6.5.3.4項第2點。 – JeremyP