2014-10-05 143 views
-4

你好,我有一个幻灯片的例子,我似乎不明白为什么函数中的while循环只发生一次。我解释它的方式是它会永远持续下去,但显然它不会。为什么这个函数的while循环无限运行?

#include <stdio.h> 

int main() 
{ 
    int a = 481; 
    int b = 910; 
    int result = 0; 
    result = gcd(a, b); 
    printf("%d\n", result); 
    return 0; 
} 

int gcd(int a, int b) 
{ 
    while(b!=0) // HERE IS MY PROBLEM!, Wouldn't this while loop go on forever? 
    { 
     int tmp = b; 
     b = a% b; 
     a = tmp; // how could 'a' be 13 if tmp is 0, at beginning they do tmp = b(0) 
    } 
    return a; 
} 

我只是不明白它...它说,虽然B不等于0,和我们的B是910,所以它永远不会是0,这意味着while循环永远不会结束,现在做它?同样在函数tmp = b中,它是0然后它们修改b,但是即使它们修改b温度仍然为0,因为在修改之前b原本是0 ..这里是内嵌..

编辑: 我犯了错误,说tmp = b将始终为0,从内部函数看b的值,并忘记b从外部910。

+2

如果你调试它,这是非常容易理解的。我只是没有得到的是为什么你不会调试。在循环内添加一些'printf'语句。您还应该启用警告并处理它们。 – 2014-10-05 21:04:39

+0

我会尝试这种信息。 – Belphegor 2014-10-05 21:05:29

+0

@DavidHeffernan说了些什么,或者只是在调试器中遍历循环几次以查看真正发生了什么? – 2014-10-05 21:05:35

回答

2

循环运行不止一次,并且每次循环运行时,b的值将小于先前的迭代,因为(a%b)是范围[0,b)中的整数,它是独占的b。

在第一次迭代: A = 481,B = 910

对于第二次迭代: B = A%B => 481 一个= 910

对于第三次迭代 一个= 481 b =(910%481)= 429

tmp永远不会为0,因为如果b为0,则循环停止并且0不会被分配给tmp。

2

首先请注意,变量ab按值传递给gcd()。这意味着函数gcd()中的局部变量(参数)abmain()中的变量ab无关,除非命名符合。

在函数,在循环之前,该值是:

a = 481 b = 910 

由于b不为零,则执行循环:

a = 481 b = 910 
tmp := 910 
b := 481 % 910 := 481 
a := 910 

然后再次循环检查,和b仍然不为零:

a = 910 b = 481 
tmp := 481 
b := 910 % 481 := 429 
a := 481 

and the loop repeats agai N,因为b仍然不为零:

a = 481 b = 429 
tmp := 429 
b := 481 % 429 := 52 
a := 429 

,并再次:

a = 429 b = 52 
tmp := 52 
b := 429 % 52 := 13 
a := 52 

,并通过循环体最后一次:

a = 52  b = 13 
tmp := 13 
b := 52 % 13 := 0 
a := 13 

现在b为零,因此循环终止,并返回a中的值,即13

请注意,abmain()中的值未更改。你可以证明这一点:

printf("GCD(%d, %d) = %d\n", a, b, result); 

这是一个更好的输出,因为它标识输入值以及结果。

2

如果您通过每个迭代的工作你自己,你会发现,它确实终止:

迭代1:
一个== 481
b == 910

迭代2:
一个== 910
b == 481

迭代3:
一个== 481
b == 429

迭代4:
一个== 429
b == 52

迭代5:
一个== 52
b == 13

迭代6:
a == 13
b == 0 < - 终止符

随意问,如果它还没有意义。