K&R 1.6 数组 // 数组结构中的数字表示

K&R 1.6 Arrays // Digit representation in an array construct

我找到了这个关于在 C 语言中使用数组的示例代码。

#include <stdio.h>

main () {
    int c, i;
    int ndigit[10];

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

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

printf("digits =");
for (i = 0; i < 10; ++i)
    printf(" %d", ndigit[i]);
}

我以前从未见过数组,但我想我明白了。 不过,我不确定为什么必须在 '..' 中插入数字值,也不确定为什么 i 的赋值必须表示为 c-'0'.

这是书中的一段话,应该可以澄清我的疑惑:

This particolar program relies on the properties of the character representation of the digits. For example the text if (c >= '0' && c <= '9') determines whether the characters in c is a digit. If it is, the numeric value if that digit is c - '0'.

我不明白这些值如果是字符怎么能用在算术表达式中,是因为它们映射到数值吗?

那么为什么整个程序如果像 if (c >= 0 && c <= 9) 那样写成数字就不能工作,如果 c 不是这样写的(我的理解是只是“任何数字 c 是负 0。

如果您看到 getchar() 的手册页,上面写着

....reads the next character from stdin and returns it as an unsigned char cast to an int....

因此,数字 [示例,9] 的输入被视为 char 输入和相应的编码 [通常为 ASCII] 值由 getchar().

返回

现在回答你的问题,

why the digit values have to be inserted in '..'

A digit [或任何其他字符,就此而言],写为'.',表示相同的相应ASCII值。检查 ASCII table here.

为了便于理解,99'9' 表示相应的 ASCII 57.

why the assignment of i has to be expressed as c-'0'.

如果仔细观察ASCII table,可以看到,09对应的值是有顺序的。因此,要获得特定数字 作为 int 值,我们可以执行 c - '0'c - 48 相同,这将为我们提供数字 作为一个int.

I don't understand how can these values be used in arithmetical expressions if they are characters, is it because they are mapped to numerical values?

getchar()returns字符read.Prototype为

int getchar(void)

读取一个字符时getchar() returns读取字符的ASCII值。

char 的 0 到 9 的 ASCII 值是连续的。所以如果我们有

就利用它
char ch = '5'; 
int i = ch - '0'; /* 53 - 48 = 5 */

将为您提供整数值 5。将字符转换为整数。该算法通过隐式转换执行。

如果你有一个字符 '8' 那么这不会给你整数值 8 但会返回 ASCII 值 56。因此在算术 ch - '0' 期间因为两者都是 char 各自的 ASCII 值使用并执行算术运算

TL;DR: "char" 只是一个单字节长的整数。

I don't understand how can these values be used in arithmetical expressions if they are characters, is it because they are mapped to numerical values?

在 C 中,一个字符是 "smallest addressable unit of the machine that can contain basic character set. It is an integer type." [1]。通常,char 相当于 "a one-byte-long integer",因此它们可以保存从 0 到 (2^8)-1 或 [0,255] 的值。

话虽这么说,当你写作时

char c = '9';

你说的是 "c is a one-byte-long integer whose value is the character-set representation of the character 9"。通过查看最常见的字符集 ASCII table [2],我们看到字符 9 的整数值为 57,因此上面的表达式等同于

char c = 57;

要将数字的字符集值转换为数字本身(例如“9”转换为 9,或 57 转换为 9),您可以依赖 属性 字符集,数字始终按顺序存储并且越来越多地减去“0”的值,在 ASCII 中为 48,所以:

char c;
c = '9' - '0'; /* = 9 In any character set */
c = 57 - 48;   /* = 9 */
c = '9' - 48;  /* = 9 In ASCII */
c = 57 - '0';  /* = 9 In ASCII */

请记住,虽然 ASCII 是最常见的字符集,但这实际上取决于机器。

[1] http://en.wikipedia.org/wiki/C_data_types#Basic_types

[2]http://www.asciitable.com/