Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 查看有关循环的帮助_C_Loops - Fatal编程技术网

C 查看有关循环的帮助

C 查看有关循环的帮助,c,loops,C,Loops,因为是时候准备期末考试了,所以我必须介绍一些关于循环的详细信息。我现在被这个问题困住了 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);

因为是时候准备期末考试了,所以我必须介绍一些关于循环的详细信息。我现在被这个问题困住了

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;
  }
}
int main(无效){
int x=0;
int y=0;
而(y<10){
x=0;
而(x!=y){//
x=x+3;//这个语句我们要执行多少次?
}
printf(“x是%d\n”,x);
y=y+1;
}
}
基本上,我希望看到输出是什么,以及我们提到的语句运行了多少次。换句话说,printf输出是什么样子的

我希望你能帮我做这件事


非常感谢。

这不是一个技巧性的问题,就是一个考虑不周的问题(或者可能是一个比最初看起来更高级的问题)

答案是不确定的,因为它取决于整数溢出的属性。

我会让你明白为什么会这样。如果你一开始看不到,试着用笔和纸进行几次迭代。如果这引起了更多问题,请随时提问。:)

while(x!=y){
可能会使while循环无限大,而且永远不会中断

例如

  • 第一个循环x=0,y=0
  • 第二个while不执行
  • 第二次迭代x=0,y=1
  • 在第二个while循环中
    • 迭代1,x=3
    • 迭代2,x=6
    • 它继续下去,因为x永远不会是1

此线路会导致问题

 x = 0;
 while (x != y) {// 
   x = x + 3; // how many times will we do this statement?
 }

y=1
时,因为
x
将继续增加,直到它达到最大整数值(除非发生溢出包装,否则它不能等于y,这将导致无限循环)。

我认为你的内部,而无限循环是因为:


x=0,y=1,那么x=x+3(x=3)总是!=1,因此它首先会导致无限循环,因为问题的性质,而且没有官方(据我所知)的溢出包装标准不依赖于实现,答案在形式上是*不确定的*

也就是说,非正式地说,让我们来计算一些数字吧。我将计算32位的
int
,尽管64位的数字更令人印象深刻。选择
3
作为增量是非常有利的,(也许是出于设计?)因为2^32和2^64都不能被它平均整除,因此它非常适合溢出连续性

让事情变得更简单的一些关键数字:

 2147483646 := (715827882 * 3)
-2147483647 := (2147483646 + 3) with overflow
Y=0,X=0,因此不执行迭代语句

  • Y=1,X=0,3,6,9…2147483646在715827882增量之后。下一个增量将溢出,X=-2147483647。另一个715827882增量之后,X=-1。再增加一个增量,返回正区域,X=2。重复整个过程,X=1,总共4*715827882+3,总和=2863311531
  • Y=2,X=0,3,6,9…回想一下上面的(1),需要2*(715827882+1)个增量才能达到2,也就是说,一次完整通过。因此,又有1431655766次执行,总和=4294967297
  • Y=3,由于明显的原因,Y=X=3在一次迭代中。sum=4294967298
  • Y=4,重复(1),但再增加一个增量;因此,4*715827882+3+1次迭代,或2863311533。总和=7158278830
  • Y=5,重复(2),但再增加一个增量;因此再增加2*(715827882+1)+1次迭代,或1431655767,总和=8589934597
  • Y=6,重复(3),但再增加一个增量;因此再增加1+1个迭代,总和=8589934599
  • Y=7,重复(4),但再增加一个增量;因此再增加4*715827882+3+1+1个迭代,或2863311533。总和=11453246132
  • Y=8,重复(5),但再增加一个增量;因此再增加2*(715827882+1+1)+1次迭代,或1431655768,总和=12884901900
  • Y=9,重复(6),但再增加一个增量;因此再增加1+1+1个迭代,总和=12884901903
  • 假设每秒可以旋转3亿次迭代,则大约需要42.95秒才能完成

    我将把64位的计算留给大家思考。然而,为了思考实际的数字,(val+=3)通过64位整数空间的增量将需要6148914691236517206迭代,上面的一些步骤需要我们做两次,其他步骤一次,其他步骤则不需要

    修改了测试程序,以确保我们使用32位有符号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和y的初始值,然后完成每个步骤,根据需要修改x和y,并在出现printf时写下。当你使用while语句时,看看你的x和y值,看看应该发生什么。
    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