2017-10-13 193 views
1
#include <stdio.h> 
      int main() { 
       int i = -1; 
       int sum = 1000; 
       printf("\nThe value of sum to start is: %d", sum); 
       while (i <= 0) { 
        i = i - 1; 
        sum = sum + 1; } 
       if (sum == 0) 
        printf("\nSum is zero"); 
       if (sum < 0) 
        printf("\nSum is less than zero"); 
       if (sum > 0) 
        printf("\nSum is greater than zero"); 
       printf("\n"); 
      } 

任何人都可以解釋爲什麼sum的結果會小於0嗎? 以及while循環將如何結束?二進制補碼算術

回答

3

該程序導致undefined behaviour。一段時間後,sum將達到int的最大可能值。那麼sum + 1會導致由於算術運算中的溢出而導致的未定義行爲。

i也有類似的問題(如果我們修復sum問題,它將首先溢出)。

未定義的行爲意味着任何事情都可能發生。優化器可能吐出與實際代碼無關的東西,或者編譯器甚至會拒絕編譯代碼(因爲UB保證會在所有代碼路徑中發生)。

Example compilation by gcc - 將while循環替換爲無所事事的無限循環,因爲優化程序刪除了一些未定義的代碼路徑。

+0

謝謝。它現在是有道理的。 –