2014-02-16 36 views
1
int get() 
    { 
     static i = 1; 
     return i++; 
    } 

    int main(int argc, char *argv[]) 
    { 
     printf("%d %d %d\n", get(), get(), get()); 
     return 0; 
    } 

輸出:3 2 1(順序取決於編譯器)對於後增量

問:但是爲什麼前值增量返回的靜態變量(文件範圍)的。後/前增量的拇指規則是什麼?我從來沒有得到正確的。請幫忙。

好吧,讓我來更具體一些,我讀的所有例子都是這樣的表達式,然後賦值或賦值然後遞增。但是,這是什麼樣的表達式,return i++; func(a++);我是這樣讀的:「在i ++之後沒有分配,因此返回最後遞增的值」(在此糾正)

+0

order is undefined..but爲什麼值返回1? –

+0

您需要閱讀[順序點](http://en.wikipedia.org/wiki/Sequence_point)。 – devnull

+0

@codeymonkey閱讀http://stackoverflow.com/questions/17366847/what-is-the-difference-between-pre-increment-and-post-increment-in-the-cycle-fo –

回答

0

這裏有兩個問題,生命期和範圍。

變量的作用域是可以看到變量名的地方。在這裏,我只在函數get()中可見。

變量的生命週期就是它存在的時期。如果我沒有定義關鍵字static,則生命週期將從get()中的get()返回;所以每次通話都會重新初始化爲1。

關鍵字static用於將變量的生存期延長到程序的生命週期;例如初始化一次只發生一次,然後變量保留它的值 - 不管它是什麼時候 - 將來所有調用get()。 What is the difference between pre-increment and post-increment in the cycle (for/while)?

來源:答案在this地方

更新1

後增量的工作原理是使現有價值的臨時副本,然後遞增後和預增量之間

差異原始值,然後最終返回臨時表達式的結果。因此,看起來增量是在表達後評估中完成的,但事實並非如此,並且一個示範程序如果感興趣,則證明這是相當直接的。這是臨時副本,使後昂貴。 (感謝WhozCraig修正)

更新2

。這都是後遞增一元運算。它們都是操作數的臨時副本(在第一種情況下爲i,在第二種情況下爲a),然後遞增操作數,然後作爲後處理表達式的結果返回臨時副本。在第一種情況下的結果是i遞增並且它在增量之前的值被返回。在第二種情況下,a遞增並且在增量之前調用func(由WhozCraig給出)

+0

不幸的是,關於前後增量鏈接問題的最佳答案是錯誤的。這不是它的工作方式,儘管它在學術界通常以這種方式教授(再次,不幸)。通過臨時複製* existing *值,然後*增加原始值,然後最終返回*臨時*作爲表達式的結果,後增量工作。因此,它*出現*增量完成後表達式評估,但事實並非如此。如果有興趣的話,演示這個示例程序是相當直接的。這是臨時副本,使後昂貴。 – WhozCraig

+0

好吧,讓我更具體一些,我讀的所有例子都是,a = i ++;或a = ++ i;這些是增量表達式然後賦值或賦值然後增量。但是這些表達是什麼,返回i ++; FUNC(一++);在i ++之後,我會像這樣讀取它,因此返回最終值。 –

+1

@codeymodey這些都是後增加一元操作。它們都是操作數的臨時副本(第一種情況爲「i」,第二種情況爲「a」),然後遞增操作數,然後返回臨時副本作爲後處理表達式的結果。第一種情況的結果是'i'遞增,並且它的值* *在增量返回。在第二種情況下,'a'遞增,'func'被調用,* *之前的值爲增量。 – WhozCraig