为什么代码在经过一定次数的迭代后仍会不断运行?

时间:2019-05-01 11:22:12

标签: c

请考虑此C代码

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

它不会以这种迭代次数运行,但是会以较低的迭代次数(例如while (i < 200000)

产生一些结果)

那是为什么?

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

2 个答案:

答案 0 :(得分:2)

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

long long s = 17;

并以这种方式打印:

printf("%lld", s);

此素数搜索的未优化版本将花费相当长的时间,直到2000000为止的所有数字,因此,也许您只是认为它在不运行时会无休止地运行。我建议通过将if (i % 1000 == 0) printf("%d %lld\n", i, s);之类的打印内容放入循环中进行调试,然后您可以查看打印的距离以及它是否仍在工作。对我来说,它正在工作(当然有long long修复程序。)

答案 1 :(得分:1)

因为您知道这将是积极的,所以您可以使用

unsigned long long s = 17;

然后使用

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

您也可以将其用于i