10 如何分隔 n = 10 * n + (s[i] - '0') 中的数字?

How does 10 separate the digits in n = 10 * n + (s[i] - '0')?

此函数将一串数字转换为其等效的数字:

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;
}

我的问题是关于这一行的 -> n = 10 * n + (s[i] - '0');

特别是这部分10 * n。我不明白 10 影响执行的方式。如果我删除它,表达式只是将数字相加。不明白10乘以0是怎么把数字分开的

如果你有一个数字,例如 1234 那么它可以像表达式的结果一样获得

( ( ( ( 0 ) * 10  + 1 ) * 10 + 2 ) * 10 + 3 ) * 10 + 4

如果数字存储为字符符号,例如“3”,那么要获得数字 3,您可以编写 '3' - '0'.

请注意,当传递的字符串包含负数或数字以符号'+'开头时,显示的函数将不起作用。

它的参数也应该用限定符 const 声明,因为传递的字符串在函数中没有改变。

int atoi( const char s[] );

考虑数字 1234。它由数字 1、2、3 和 4 组成。如果您按此顺序收到这些数字,则可以逐步构建原始数字:

n = 1
n = 1 * 10 + 2 = 12
n = 12 * 10 + 3 = 123
n = 123 * 10 + 4 = 1234

将其转化为一个等式:

n = ((((1 * 10) + 2) * 10) + 3) * 10 + 4
  = ((1 * 10 * 10 + 2 * 10) + 3) * 10 + 4
  = 1 * 10 * 10 * 10 + 2 * 10 * 10 + 3 * 10 + 4
  = 1 * 1000 + 2 * 100 + 3 * 10 + 4
  = 1000 + 200 + 30 + 4
  = 1234

所以第一个数字比后面的数字乘以更多的 10。它只是通过一次乘以一个来分配 10 的次方。

正如我刚刚在 中所写的那样,如果我让你把数字 34 放在一起形成一个新数字,你可以做 10 × 3 + 4 = 34,如果我让你把数字 1234 拼在一起形成一个新数字,你可以做 100 × 12 + 34 = 1234.

乘以 10 相当于在右边添加一个 0 并将所有内容向左移动一个数字:3 × 10 = 30。类似地,乘以 100 相当于在右边添加两个 0 并将所有内容向左移动两位数:12 × 100 = 1200.

在基数 10 中,每增加一个数字,左边数字的值就会增加 10 倍。