为什么一段代码在迭代一定次数后会一直保持运行?

Why does a code keeps running endlessly after a certain number of iterations?

请考虑此 C 代码

void main() {
    int i, s = 17;
    for (i = 8; i < 2000000; i++) {
        if (ifprime(i))
            s += i;
    }
    printf("%d", s);
}

它不会 运行 使用此迭代次数,但会产生一些具有较低迭代次数的结果,例如 while (i < 200000)

这是为什么?

(请注意,我不是在寻求解决方案,非常感谢)

这将溢出 32 位整数。这是未定义的行为,虽然这通常不会导致您的程序无休止地 运行,但这是有可能的,因为无法保证当您的程序表现出未定义的行为时会发生什么。请尝试 long long,它至少是 64 位(对于签名版本,至少是 63 位和一个符号位)。

long long s = 17;

然后这样打印:

printf("%lld", s);

这个素数搜索的未优化版本对于 2000000 以内的所有数字都将花费相当长的时间,因此您可能只是认为它在无休止地 运行ning,而实际上并非如此。我建议通过将 if (i % 1000 == 0) printf("%d %lld\n", i, s); 之类的打印放入循环中进行调试,然后您可以看到它走了多远以及它是否仍在工作。对我来说,它正在工作(当然是 long long 修复)。

因为你知道这会是积极的,你可以使用

unsigned long long s = 17;

然后用

打印出来
printf("%llu",s);

您也可以将其用于 i