2016-05-31 54 views
2

我無法理解的代碼,以K &得到一個int R. 特別是這個函數的最後一行:K&R代碼獲得一個int

void getint(int *pn) 
{ 
    int c; 
    while (isspace(c = getch())) 
     ; 

    for (*pn = 0; isdigit(c); c = getch()) 
     *pn = 10 * *pn + (c - '0') ; 
} 
+0

代碼1)將數字存儲在存儲器地址'pn'處,2)用0初始化結果,3)只要輸入數字就從控制檯讀取輸入,4)將輸入的字符轉換爲數字和5)通過將當前值乘以10並添加最後輸入的數字來更新目標號碼。 – collapsar

+0

@itharob我只關心一個代碼。我如何正確地格式化這個問題 –

+0

@Olaf getch()是通過緩衝區獲取字符的函數。它在第4.3節 –

回答

4

這裏是什麼是怎麼回事:

  • 由於pn是指針傳遞結果的指針,分配或讀取*pn意味着訪問我們迄今爲止的結果。您在此函數內所做的任何更改都可以在調用者的環境中訪問,調用者向您傳遞了指向int的指針。
  • 由於十進制數字的代碼彼此相鄰,因此c-'0'表示代表數字的字符代碼的數字值。例如,如果c'5'(單引號),則c-'0'等於5(不含引號)。

現在算法的其餘部分變得清晰了:將數字附加到數字的右側意味着先取數字的前值,再乘以10,然後將數字的值加到結果上。

例如,如果你正在閱讀"12345"和您已經閱讀"123",然後*pn123,而下一個數字是4。您將123乘以10即可獲得1230,並將4添加到它。現在你有1234,下一個數字是5。你再乘以10得到12340,並加上5得到你的最終結果12345

+0

非常感謝。我不知道爲什麼它乘以10,但現在它是有道理的。 –

+0

@MilesGaitan不客氣!當沒有溢出時,乘以數字系統的基數相當於左移一位。它的工作方式與十進制的方式相同('<<'運算符將數字乘以'2'),對於任何數字系統(十六進制,八進制,base-36或任何其他基數)。 – dasblinkenlight

+1

爲什麼你因爲兩個'*'操作符而感到困惑?其中一個用作乘法運算符,另一個只是取消引用指針,我喜歡'10 *(* pn)'。 –

-1

我敢肯定這是代碼由char.So閱讀數字字符,這將是像

void input_int(int *pn) 
{ 
    for (*pn = 0; isdigit(c); c =getch()) 
    *pn = 10 * *pn + (c - '0') ; 
} 

,並作爲

int a; 
input_int(&a); 

正在發生的事情是輸入整數快我們通過char讀取數字char並同時創建一個整數。

+0

是的函數是getint(int * pn)。函數中還有代碼用於錯誤處理和跳過空格。 –