2017-10-13 570 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

谢谢。它现在是有道理的。 –