這是C代碼由丹尼斯里奇,章「陣列」:爲什麼我們需要「-'0'」來修改數組?
#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變量和常量與算術表達式中的整數相同。這很自然,方便;例如,c-'0' 與對應於該字符0和9之間的值的整數表達式‘保存在c 0’到‘9’,並且因此對於陣列的有效下標ndigit
「幸運的是,對於所有字符集都是如此」的想法是,這不會取決於特定的字符編碼,例如ASCII。它對所有字符集都是「真實的」,因爲它在C規範中。 '[c-'0']'也適用於編碼爲「0」的字符集,然後「ndigit ['0'] ++'將工作相同。 (除此之外,你的答案是正確的 - 只是想指出*它不依賴於ASCII *的主要觀點;) – usr2564301
非常感謝!我使用ASCII更清晰,但你絕對正確 –
你比MikeCat更好地解釋它! – FDuldul