为什么代码在经过一定次数的迭代后仍然无休止地运行?
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 上无休止地运行?