[英]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。它由數字 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 的冪。
如果你有一個像1234
這樣的數字,那么它可以像表達式的結果一樣獲得
( ( ( ( 0 ) * 10 + 1 ) * 10 + 2 ) * 10 + 3 ) * 10 + 4
如果數字存儲為字符符號,例如 '3' 那么要獲得數字3
您可以編寫'3' - '0'
。
請注意,當傳遞的字符串包含負數或數字以符號“+”開頭時,顯示的函數將不起作用。
它的參數也應該用限定符const
聲明,因為傳遞的字符串在函數中沒有改變。
int atoi( const char s[] );
正如我剛剛在另一個答案中寫的那樣,如果我讓你把數字3
和4
粘在一起形成一個新數字,你可以做10 × 3 + 4 = 34
,如果我讓你把數字12
和34
把它們粘在一起形成一個新的數字,你可以做100 × 12 + 34 = 1234
。
乘以 10 相當於在右邊加上一個 0 並將所有東西向左移動一個數字: 3 × 10 = 30
。 類似地,乘以 100 等效於在右側添加兩個 0,並將所有內容向左移動兩位數: 12 × 100 = 1200
。
在基數 10 中,每增加一個數字,左側數字的值就會增加 10 倍。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.