C语言atoi函数中10*n的作用是什么?10如何分隔数字位?
参考代码
int atoi(char s[]) { int i, n; n = 0; for ( i = 0 ; s[i] >= '0' && s[i] <= '9' ; ++i ) { n = 10 * n + (s[i] - '0'); } return n; }
10 * n 逻辑解释 10 * n的核心作用是将已经解析完成的高位数字整体提升一个十进制位,再和新解析出的个位数字相加,最终拼接成完整的数值。
我们以输入字符串为"123"的场景推演完整运行过程:
- 初始状态:n=0,遍历到第一个字符
s[0] = '1',s[i] - '0'转换得到数字1 - 第一次运算:
n = 10 * 0 + 1 = 1,对应当前解析到的数值为1 - 遍历到第二个字符
s[1] = '2',转换得到数字2 - 第二次运算:
n = 10 * 1 + 2 = 12,对应当前解析到的数值为12 - 遍历到第三个字符
s[2] = '3',转换得到数字3 - 第三次运算:
n = 10 * 12 + 3 = 123,正好是字符串对应的整数值
如果去掉表达式中的10 * n,就不会对高位做升位处理,只会对所有数字字符转换后的数值做求和:
- 第一次运算:
n = 0 + 1 = 1 - 第二次运算:
n = 1 + 2 = 3 - 第三次运算:
n = 3 + 3 = 6
和你观察到的运行结果一致。
补充说明:这里乘10是适配十进制的计数规则,每一位的位权是10的幂次,每向后读取一位,之前已经解析完的所有位的位权都会提升10倍,所以需要先乘10再追加新的个位数字。
内容的提问来源于stack exchange,提问作者user11329352
相关产品推荐
相关产品推荐

