2011-04-28 47 views
4

我有下面的代碼,我希望輸出爲:充分認識前綴增量(++)操作

foo(0) -- 2 /* 1*2 */ 
foo(2) -- 12 /* 3*4 */ 
foo(4) -- 30 /* 5*6 */ 

但我有

foo(2) -- 4 
foo(4) -- 16 
foo(6) -- 36 

代替。有人可以向我解釋發生了什麼事嗎?

include <stdio.h> 

int main() 
{ 
    int counter; /* counter for loop */ 

    counter = 0; 

    while (counter < 5) 
     printf("foo(%d) -- %d\n", counter, ((++counter)*(++counter))); 

    return (0); 
} 

回答

4

(++counter)*(++counter)是因爲一個變量而沒有一個順序點改性兩次用C實際上未定義行爲(即;)之間。結果可能因不同編譯器而異。有些人可能選擇使用格式化硬盤,但幸運的是,您的編譯器沒有。

除此之外,關於前綴增量的理解很少。 bar(++i)簡寫爲

i += 1; 
bar(i); 
+0

+1對於過於迂腐的編譯器。 – Thomas 2013-06-14 07:47:17

0

前綴增量意味着增量在剩下的操作之前完成。據我所知,官方要求是++計數器的評估不是原始數值。

很可能被擴展爲一個單位中的語句之前,像這樣:

counter = counter + 1; 
counter = counter + 1; 
printf("foo(%d) -- %d\n", counter, ((counter)*(counter))); 

這將創建你所看到的行爲。我的建議是避免壓力測試這些角落案例太多。

13

一旦您對變量使用++ - 前綴或後綴,您將無法在同一個變量上再次使用它,直到在下一個sequence point之後。如果你這樣做,代碼的行爲是不確定的 - 編譯器可以做任何想要的東西

代碼中兩個(++counter)表達式之間沒有順序點,所以你違反了這條規則。你必須寫這樣的事情,而不是:

while (counter < 5) { 
    printf("foo(%d) -- %d\n", counter, (counter+1) * (counter+2)); 
    counter += 2; 
} 
+3

很好的解釋。 – 2011-04-28 00:31:13

0

你期望它做

++ C = 1 * + C = 2

= 1 * 2 = 2

什麼是實際發生的事情是

+ C = 2 * + C = 2

= 4

正如其他人指出的 - 這是未定義的行爲。編譯器不需要透露它的內部工作,除非你強迫它通過將複雜的語句分解成更小的片斷