2015-08-28 64 views
-2
main(){ 

    int x = 256, y = 4; 
    printf("%d\n\n", x++ + ++y); //output = 261 
    printf("%d\n\n", x);   // output = 257 
    printf("%d", y);    // output = 5 

} 

最終答案是261,因爲256 - > 257(後運算符)和5 - > 5(前運算符)導致256 + 5 = 261?如何在使用post/pre increment操作符時遇到問題?

+0

這都是變量何時被打印的問題。如果預增量,則在增量後打印該變量。如果後增量,變量在增量前打印。 – user3629249

+0

'main()'不正確。使用['int main(void)'](http://stackoverflow.com/q/204476/995714)而不是 –

回答

3

鑑於:

int x = 256, y = 4; 
printf("%d\n\n", x++ + ++y); 

簡而言之:x++返回值256然後遞增x至257. ++y增量y至5,並返回值5。因此,增加了256和5,產生了261

龍windedly:x++評估爲的x的電流值,其是256和時間表的yx到257.同樣++y調度增量的增量爲5,求增加值5。因此,增加了256和5,產生了261。涉及xy的條款的評估順序沒有定義,但是在添加之前都必須對兩者進行評估(儘管在評估添加時增量可能不完整)。因爲在參數(和表示函數的表達式)已經被評估但函數被調用之前存在「序列點」,所以當調用printf()時,增量必須是完整的。

接下來的兩條語句打印爲xy2575

請注意,這兩個printf()操作可以合併爲一個。如果不調用未定義的行爲,它們都不能與第一個結合。 (有關該主題的更多信息,請參閱Multiple increments and undefined behaviour)。

因此,考慮到我不會很好地表達它的寫法,您似乎有正確的解釋。另外,標準C在所有功能上都要求返回類型超過15年(因爲C99已標準化)。你應該寫:

int main(void) 

main()函數不帶任何參數。 (見What should main() return in C and C++?的全部細節。)

注意,這個問題只能調用完全定義的行爲(至少,在printf()語句)。它不會詢問序列點之間的單個變量的多個增量。

+0

Nit:'x ++'*評估*爲'256'和'++ y' *評估*爲' 5',但'x'和'y'在評估之後可能不會立即更新;唯一的要求是它們要在函數調用之前的下一個序列點進行更新。這是'x ++ + x ++'表達式爲什麼會調用未定義行爲的原因之一;表達式評估的順序*和*副作用的應用順序未指定,因此行爲不一致。 –

+0

@JohnBode:查看更新。 –