为什么一段代码在迭代一定次数后会一直保持运行?
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
请考虑此 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