我無法理解的代碼,以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') ;
}
我無法理解的代碼,以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') ;
}
這裏是什麼是怎麼回事:
pn
是指針傳遞結果的指針,分配或讀取*pn
意味着訪問我們迄今爲止的結果。您在此函數內所做的任何更改都可以在調用者的環境中訪問,調用者向您傳遞了指向int
的指針。c-'0'
表示代表數字的字符代碼的數字值。例如,如果c
是'5'
(單引號),則c-'0'
等於5
(不含引號)。現在算法的其餘部分變得清晰了:將數字附加到數字的右側意味着先取數字的前值,再乘以10,然後將數字的值加到結果上。
例如,如果你正在閱讀"12345"
和您已經閱讀"123"
,然後*pn
爲123
,而下一個數字是4
。您將123
乘以10
即可獲得1230
,並將4
添加到它。現在你有1234
,下一個數字是5
。你再乘以10得到12340
,並加上5
得到你的最終結果12345
。
非常感謝。我不知道爲什麼它乘以10,但現在它是有道理的。 –
@MilesGaitan不客氣!當沒有溢出時,乘以數字系統的基數相當於左移一位。它的工作方式與十進制的方式相同('<<'運算符將數字乘以'2'),對於任何數字系統(十六進制,八進制,base-36或任何其他基數)。 – dasblinkenlight
爲什麼你因爲兩個'*'操作符而感到困惑?其中一個用作乘法運算符,另一個只是取消引用指針,我喜歡'10 *(* pn)'。 –
我敢肯定這是代碼由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並同時創建一個整數。
是的函數是getint(int * pn)。函數中還有代碼用於錯誤處理和跳過空格。 –
代碼1)將數字存儲在存儲器地址'pn'處,2)用0初始化結果,3)只要輸入數字就從控制檯讀取輸入,4)將輸入的字符轉換爲數字和5)通過將當前值乘以10並添加最後輸入的數字來更新目標號碼。 – collapsar
@itharob我只關心一個代碼。我如何正確地格式化這個問題 –
@Olaf getch()是通過緩衝區獲取字符的函數。它在第4.3節 –