K& R 1.6阵列//数组构造中的数字表示

时间:2015-01-29 11:08:36

标签: c arrays digit kernighan-and-ritchie

我在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'

这是本书的一个段落,应该澄清我的怀疑:

  

此特殊程序依赖于数字的字符表示的属性。例如,文本if (c >= '0' && c <= '9')确定c中的字符是否为数字。如果是,则该数字为c - '0'的数值。

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

那么为什么整个程序如果被编写为if (c >= 0 && c <= 9)中的数字就不起作用,如果c没有以这种方式编写,那么它是有效的(我理解的只是“无论数字c是否为0)。

3 个答案:

答案 0 :(得分:3)

TL; DR:a&#34; char&#34;只是一个1字节长的整数。

  

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

在C中,char是机器中可以包含基本字符集的最小可寻址单元。它是一个整数类型。&#34; [1]。通常,char等效于&#34;一个字节长的整数&#34;,因此它们可以保存从0到(2 ^ 8)-1或[0,255]的值。

话说,当你写作

char c = '9';

你说&#34; c是一个长度为一个字节的整数,其值是字符9&#34;的字符集表示。通过查看最常见的字符集ASCII表[2],我们看到字符9的整数值为57,因此上面的表达式相当于

char c = 57;

要将数字的字符集值转换为数字本身(例如&#39; 9&#39;至9或57至9),您可以依赖数字字符集的属性总是按顺序存储,越来越多,只需减去&#39; 0&#39;的值,在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/

答案 1 :(得分:2)

如果您看到getchar()的手册页

  

....从标准输入读取下一个字符并将其作为unsigned char强制转换为int ....

因此,数字 [example,9]的输入被视为char输入,并且{getchar()返回相应的编码[通常ASCII]值。 1}}。

现在回答你的问题,

  

为什么数字值必须插入'..'

数字 [或其他任何字符],写为'.',表示相应的ASCII值。检查ASCII表here

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

  

为什么i的赋值必须表示为c-'0'。

如果您仔细注意到ASCII表,可以看到,09的相应值是按顺序排列的。因此,要将特定数字设为 int值,我们可以执行与c - '0'相同的c - 48,这将为我们提供数字 as int

答案 2 :(得分:1)

  

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

getchar()返回字符read.Prototype为

int getchar(void)

读取字符时getchar()返回char读取的ASCII值。

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

,只需使用它
char ch = '5'; 
int i = ch - '0'; /* 53 - 48 = 5 */

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

如果你有一个字符'8',那么这不会给你整数值8但是会​​返回ASCII值56.所以在算术ch - '0'期间因为两个都是char,所以使用相应的ASCII值并执行算术运算