![](/img/trans.png)
[英]How is "++argv" correct in this program from "The C programming Language by Dennis Ritchie"?
[英]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.