我无法理解的代码,以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节 –