由于是时候学习决赛,我必须提供一些关于循环的详细信息。我目前仍然坚持这个问题
int main(void) {
int x = 0;
int y = 0;
while (y < 10) {
x = 0;
while (x != y) {//
x = x + 3; // how many times will we do this statement?
}
printf(“x is %d\n”, x);
y = y + 1;
}
}
基本上,我希望看到输出是什么以及我们提到的声明运行次数。换句话说,printf输出是什么样的。
我希望你能帮助我。
非常感谢你。
答案 0 :(得分:1)
此行会导致问题
x = 0;
while (x != y) {//
x = x + 3; // how many times will we do this statement?
}
y=1
以后x
将继续增加,直到达到最大整数值(除非发生一些溢出包装,否则它不能等于y - 这将导致无限循环)。
答案 1 :(得分:1)
首先,由于问题的性质以及没有官方(我知道)溢出包装的标准而不依赖于实现,答案正式* 不确定 * 强>
那就是说,非正式地让一些数字只是为了它的地狱。我将为32位int
计算这个,尽管64位的数字更令人印象深刻。 3
作为增量的选择是非常有利的,(可能是设计?),因为2 ^ 32和2 ^ 64都不能被它整除,从而使其成为溢出连续性的理想选择。
一些可以简化操作的关键数字:
2147483646 := (715827882 * 3)
-2147483647 := (2147483646 + 3) with overflow
Y = 0,X = 0,因此不执行迭代语句。
假设您每秒可以旋转三亿次迭代,则需要大约 42.95秒才能完成。
我将留下64位计算值得深思。然而,只是考虑实际数字,通过64位整数空间的(val + = 3)增量将需要 6148914691236517206 迭代,并且上面的一些步骤要求我们做两次,其他一次,而其他不在所有
修改测试程序以确保我们使用32位signed int值:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <stdint.h>
#include <inttypes.h>
int main(void)
{
int32_t x = 0;
int32_t y = 0;
uint64_t sum = 0;
while (y < 10)
{
x = 0;
while (x != y)
{
x = x + 3; ++sum;
}
printf("x is %d; sum=%" PRId64 "\n", x, sum);
y = y + 1;
}
return 0;
}
<强>输出强>
x is 0; sum=0
x is 1; sum=2863311531
x is 2; sum=4294967297
x is 3; sum=4294967298
x is 4; sum=7158278830
x is 5; sum=8589934597
x is 6; sum=8589934599
x is 7; sum=11453246132
x is 8; sum=12884901900
x is 9; sum=12884901903
答案 2 :(得分:0)
这可能是一个技巧问题,也可能是一个经过深思熟虑的问题(或者可能是一个比最初看起来更高级的问题)。
答案是不确定的,因为它取决于整数溢出的属性。
我会告诉你为什么会这样。如果您最初没有看到它,请尝试使用笔和纸进行几次迭代。如果这会引发更多问题,请随时提出。 :)
答案 3 :(得分:0)
while (x != y) {
可能会使while循环无限,永远不会破坏。
E.g。
答案 4 :(得分:0)
我认为你的内在,因为:
无限循环x = 0且y = 1则x = x + 3(x = 3)始终为!= 1因此导致无限循环