2016-05-31 90 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)。函数中还有代码用于错误处理和跳过空格。 –