簡體   English   中英

為什么我們需要“ -'0'”來修改數組?

[英]why we need “-'0'” to modify array?

這是Dennis Ritchie的C語言代碼,“數組”一章:

#include <stdio.h>
/* count digits, white space, others */
main()
{
    int c, i, nwhite, nother;
    int ndigit[10];
    nwhite = nother = 0;
    for (i = 0; i < 10; ++i)
        ndigit[i] = 0;
    while ((c = getchar()) != EOF)
        if (c >= '0' && c <= '9')
            ++ndigit[c-'0'];
        else if (c == ' ' || c == '\n' || c == '\t')
            ++nwhite;
        else
            ++nother;
    printf("digits =");
    for (i = 0; i < 10; ++i)
        printf(" %d", ndigit[i]);
    printf(", white space = %d, other = %d\n", nwhite, nother);
}

為什么我們在這一行中需要-'0'

++ndigit[c-'0'];

如果我將其更改為++ndigit[c] ,則該程序無法正常運行。 為什么我們不能只寫++ndigit[c]

我已經讀過這本書的解釋,但我聽不懂。

僅在“ 0”,“ 1”,...,“ 9”具有連續遞增的值時才有效。 幸運的是,所有字符集都是如此。 根據定義,char只是小整數,因此char變量和常量與算術表達式中的int相同。 這是自然而方便的; 例如c-'0'是一個整數表達式,其值在0到9之間,與c中存儲的字符'0'到'9'相對應,因此是數組ndigit的有效下標

要了解為什么我們需要“ -'0”,您首先需要了解ASCII表-http: //www.asciitable.com/

現在您需要了解C中的每個字符都由0到127之間的數字表示(其中extended為255)。

例如,如果您要為數字值打印字符“ 0”:

printf( "%d", '0' );

輸出:48

現在,您已經聲明了一個大小為10- ndigit[ 10 ]的數組,其中n單元格表示將數字n作為輸入給出的次數。

因此,如果您收到“ 0”作為輸入,則需要執行ndigit[ 0 ]++因此您需要從char轉換為integer。 你可以減去48(='0')

那就是為什么我們使用++ndigit[c-'0'];

如果c ='5',我們將得到

++ndigit['5' - '0']

++ndigit[ 53 - 48 ]

++ndigit[ 5 ]

就像我們想要的那樣

c = getchar()將存儲讀取到c的字符代碼,它與字符代表的整數不同。

引用N1256 5.2.1字符集

在源基本字符集和執行基本字符集中,上述十進制數字列表中的每個0后面的字符的值應比前一個的值大1。

如此所示,十進制數字的字符代碼是連續的,因此您可以通過從字符代碼中減去'0' (即0的字符代碼)將十進制數字的字符代碼轉換為字符所代表的整數。

總之, c-'0'產生c字符代表的整數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM