2014-10-05 178 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 < - 終止符

隨意問,如果它還沒有意義。