2013-08-27 16 views
0

今天我看到一個有趣的聲明與後增量和預增量。請考慮以下程序 -如果我在同一個語句中使用前增量和後增量會發生什麼?

#include <stdio.h> 

int main(){ 
    int x, z; 

    x = 5; 
    z = x++ - 5; // increase the value of x after the statement completed. 
    printf("%d\n", z); // So the value here is 0. Simple. 

    x = 5; 
    z = 5 - ++x; // increase the value of x before the statement completed. 
    printf("%d\n", z); // So the value is -1. 

    // But, for these lines below.. 

    x = 5; 
    z = x++ - ++x; // **The interesting statement 
    printf("%d\n", z); // It prints 0 

    return 0; 
} 

實際上在那個有趣的聲明中發生了什麼?聲明完成後,增加後應該增加x的值。那麼首先x對於該語句仍然是5。並且在預先增加的情況下,秒x的值應該是6或7(不確定)。

爲什麼它給出0到z的值?是5 - 56 - 6?請解釋。

+0

您將進入未定義的行爲,這實際上取決於編譯器如何處理它。 –

+0

此外[這一個](http://stackoverflow.com/questions/4176328/undefined-behavior-and-sequence-points)。 – jrok

回答

10

這是未定義的行爲。編譯器可以隨心所欲地做任何事情 - 它可以給出0,它可以給出42,它可以擦除你的硬盤驅動器,或者它可能導致惡魔飛出你的鼻子。所有這些行爲都被C和C++語言標準所允許。

+7

實際上'14.2.7'節明確禁止編譯器生成產生鼻子惡魔的代碼,但所有其他行爲都是允許的。 – Paulpro

+0

什麼是未定義的聲明? Java會毫不猶豫的;) – Julien

+0

好吧,這是未定義的行爲。但爲什麼?我想它會評估爲5 - 6(++ x在減法之前,x ++在它之後)。將它改爲(x ++) - (++ x)會改變結果嗎? – Kevin