#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");
}
任何人都可以解释为什么总和的结果会小于0? 以及while循环将如何结束?
答案 0 :(得分:3)
此程序会导致undefined behaviour。一段时间后,sum
将达到int
的最大可能值。然后sum + 1
由于算术运算中的溢出而导致未定义的行为。
i
有类似的问题(如果我们修复了sum
问题,那将首先溢出。
未定义的行为意味着任何事情都可能发生。优化器可以吐出与实际代码无关的东西,或者编译器甚至可以拒绝编译代码(因为UB保证在所有代码路径中发生)。
Example compilation by gcc - while
循环被无效循环替换,因为优化器删除了一些未定义的代码路径。