为什么代码在经过一定次数的迭代后仍然无休止地运行?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么代码在经过一定次数的迭代后仍然无休止地运行?相关的知识,希望对你有一定的参考价值。

请考虑此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以外的所有数字,素数搜索的这种未经优化的版本将需要相当长的时间,所以也许你只是认为它不是在无法运行。我建议通过将类似if (i % 1000 == 0) printf("%d %lld\n", i, s);的打印放入循环进行调试,然后您可以看到它有多远,以及它是否仍在工作。对我来说,这是有效的(当然,用long long修复)。

另一答案

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

unsigned long long s = 17;

然后打印出来

printf("%llu",s);

你也可以用它来做我

以上是关于为什么代码在经过一定次数的迭代后仍然无休止地运行?的主要内容,如果未能解决你的问题,请参考以下文章

为啥“multiprocessing.Pool”在 Windows 上无休止地运行?

为什么React hook useEffect无休止地运行?

尝试一定次数后锁定的 Python 密码系统

服务或意图服务每5秒向服务器无休止地发送位置更新?

SQL Server 无休止地“执行查询”

使用JavaScript通过一定时间后运行函数?