我在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)。
答案 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 :(得分:2)
如果您看到getchar()
的手册页
....从标准输入读取下一个字符并将其作为
unsigned char
强制转换为int
....
因此,数字 [example,9
]的输入被视为char
输入,并且{getchar()
返回相应的编码[通常ASCII]值。 1}}。
现在回答你的问题,
为什么数字值必须插入'..'
数字 [或其他任何字符],写为'.'
,表示相应的ASCII值。检查ASCII表here。
为了便于理解,9
是9
而'9'
代表相应的ASCII 57
。
为什么i的赋值必须表示为c-'0'。
如果您仔细注意到ASCII表,可以看到,0
到9
的相应值是按顺序排列的。因此,要将特定数字设为 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值并执行算术运算