簡體   English   中英

Kernighan 和 Ritchie 的主題 1.6

[英]Topic 1.6 by Kernighan and Ritchie

我正在閱讀 Kernighan 和 Ritchie 的《The C Programming language》一書,但我被困在一個話題上。

主題號 1.6 討論了數組。 在書中,他們包含了一個計算數字、空格和其他字符的程序。 程序是這樣的:

#include <stdio.h>

 main(){
       int c,i,nother,nwhite;
        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=='\t'||c=='\n')
                ++nwhite;
            else
                ++nother;


            printf("digits:");
            for(i=0; i<10;++i)
                printf(" %d",ndigit[i]);
             printf(", white space = %d, other = %d\n",  nwhite, nother);


}

首先,我不明白第一個 for 循環的目的是:

 for(i=0;i<10;++i)
             ndigit[i]=0;

其次,我無法理解這部分 while 循環背后的邏輯:

if (c>='0' && c<='9')
                ++ndigit[c-'0'];

我真的需要有人向我解釋程序背后的邏輯,以便我可以進一步使用 C 編程。

謝謝您的幫助!

ndigit[i]保存數字i (0-9) 被計數的次數。 例如, ndigit[5]包含數字5被計數的次數。 所以第一個循環只是將 all 初始化為0 ,因為到目前為止什么都沒有看到。

if 語句檢查當前字符c是否為數字。 如果是這樣,它會通過從中減去'0'來確定它是哪個數字。 這將給出所需的索引,其中包含的值增加一。

這個循環

for(i=0;i<10;++i)
             ndigit[i]=0;

用於將數組ndigit的所有元素設置為 0。數組將計算 eneterd 位數。

您可以在聲明數組時將數組的所有元素初始化為 0,而不是這個循環。

int ndigit[10] = { 0 };

至於這個說法

if (c>='0' && c<='9')
                ++ndigit[c-'0'];

那么如果輸入的字符是一個數字c>='0' && c<='9'那么表達式c-'0'會給你這個數字的整數值。 與計算機內存中的字符常量'0' - '9'相對應的字符,由它們的 ASCII 或其他一些編碼方案代碼表示。 例如 ASCII 中的 cgaracter '0'具有內部代碼48 ,字符'1' - 49 ,字符'2' - 50等等。 例如在 EBCDIC cgaracter '0'有另一個代碼240 ,字符'1' - 241等等。

C 標准保證所有數字相互跟隨。

因此,如果變量c保持某個數字,則表達式c - '0'給出從 0 (如果 c 保持 '0' )到 9 (如果 c 保持字符 '9' )的數字。

該值(從 0 到 9)用作數組ndigit中的索引。

例如,假設 c 保留字符'6' 然后c - '0'將等於整數 6。因此 ndigit[6] 增加

++ndigit[c-'0']

索引為 6 的數組元素計算輸入字符“6”的次數。

暫無
暫無

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

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