我遇到了一个编程问题,我只知道部分答案。
int f( char *p )
{
int n = 0 ;
while ( *p != 0 )
n = 10*n + *p++ - '0' ;
return n ;
}
这就是我认为该程序正在做的事情。p 是一个指针,while 循环对指针的值进行 DE 引用,直到它等于 0。但是我不明白 n 赋值行,“0”在做什么?我假设 p 的值最初是负数,这是它在增量后达到 0 的唯一方法。
我遇到了一个编程问题,我只知道部分答案。
int f( char *p )
{
int n = 0 ;
while ( *p != 0 )
n = 10*n + *p++ - '0' ;
return n ;
}
这就是我认为该程序正在做的事情。p 是一个指针,while 循环对指针的值进行 DE 引用,直到它等于 0。但是我不明白 n 赋值行,“0”在做什么?我假设 p 的值最初是负数,这是它在增量后达到 0 的唯一方法。
您将数字零(无,无)与字符0
(一个圆圈,可能带有斜线)混淆了。请注意,零在刻度线中,所以它是字符“0”,而不是数字零。
'0' - '0' = 0
'1' - '0' = 1
'2' - '0' = 2
...
因此,通过从一个数字中减去字符零,您可以得到与该数字对应的数字。
因此,假设您有以下数字序列:“4”、“2”、“1”。你如何从中得到四百二十一这个数字?你把“4”变成了四个。然后乘以十。现在你有四十个。将'2'转换为两个并添加它。现在你有四十二个。乘以十。将 '1' 转换为 1,然后加上,现在你有 421 个。
这就是将数字序列转换为数字的方式。
n
局部变量在字符串中累积传递给此函数的十进制数的值。这是 的实现atoi
,没有有效性检查。
这是循环体的工作原理:
n = 10*n + *p++ - ‘0';
赋值给n
前面的值乘以n
10 加上指针处的当前字符代码p
减去代码 0 的结果;取消引用p
后递增。
由于数字字符是按顺序编码的,因此*p-'0'
表达式表示数字的十进制值。
假设您正在解析字符串"987"
。当您通过循环n
时,从零开始;然后它被分配以下值:
n = 10*0 + 9; // That's 9
n = 10*9 + 8; // That's 98
n = 10*98 + 7; // That's 987
This is a string to number conversion function. Similar to atoi.
A string is a sequence of characters. So "123" in memory would be : '1','2','3',NULL
p Points to it.
Now, according to ASCII, digits are encoded from '0' to '9'. '0' being assigned the value 48 and '9' being assigned the value 57. As such, '1','2','3',NULL in memory is actually : 49, 50, 51, 0
If you wanted to convert from the character '0' to the integer 0, you would have to subtract 48 from the value in memory. Do you see where this is going?
Now, instead of subtracting the number 48, you subtract '0', which makes the code easier to read.