看似忽略了对for循环中变量的赋值

时间:2018-03-07 05:56:37

标签: c debugging greatest-common-divisor

void main()
{
    int a, b, r;
    //Finf GCD by Eucledian algorithm
    scanf("%d %d", &a, &b);

    for( ; b == 0; (a = b), (b = r)){
        r = a % b;
        printf("GCD is %d", a);
    }
    printf("GCD is %d", a);
}

不知怎的,这不起作用 我将a和b分配给r,但这似乎不会改变a或b的值。

2 个答案:

答案 0 :(得分:1)

这个for(;b==0;(a=b),(b=r))像这样设置for循环

  • 什么都不做任何事情
  • 只要b等于0做循环体
  • 循环体执行之间的
  • 首先将b的复制值复制为a,
    然后将r的值复制到b

请注意,如果b从非零开始,循环将永远不会执行 否则,一旦b变为非零,循环将停止执行,而不是使用r的值进行更新。

(这有点汇集了评论的答案,以便将其从未答复的问题列表中删除。对dddJewelsbbb的信用。如果他们回答并要求我,我建议删除它。)< / em>的

答案 1 :(得分:-1)

找到下面更正的工作代码,它会改变循环条件:

#include <stdio.h>

void main ()
{
  int a, b, r;
  //Finf GCD by Eucledian algorithm
  scanf ("%d %d", &a, &b);

  for (; r > 0; a = b, b = r)
    {
      r = a % b;
    }
  printf ("GCD is %d", a);
}

通过输入进行测试:16,12

16
12
GCD is 4

代码说明: 代码是Euclid算法的直接实现,用于查找GCD。这里除数(数字之一)用于获得余数(在将第二个数除以红利之后)。接下来,余数成为除数,前面的除数成为被除数,这个过程一直持续到余数为零。

代码中有足够的范围使其更优雅并处理极端情况。我尽可能地纠正了完全相同的代码,以发现确切的错误(在for循环条件下)。