在以下代码中:
www.example.com
我不明白为什么要更换这一行:
#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);
}
这一行:
if (c >= '0' && c <= '9')
给出不同的结果?例如,当使用后一个选项编写代码并且用户按下9按钮时,程序不会将其视为数字,而是视为&#34;其他&#34;。
答案 0 :(得分:3)
'0'
是0x30的字节,'9'
是0x39。但0
和9
只是0x00和0x09。
答案 1 :(得分:3)
表达式'0'
是一个字符文字。它的确切值取决于系统上使用的编码,但在最常见的编码方案(ASCII)中,我们可以检查,例如this table并查看其值为48
十进制。
另一个表达式0
是一个整数字面值,其值为0
。
例如0 == '0'
与执行0 == 48
相同,这绝对不是真的。
答案 2 :(得分:0)
在第一种情况下,值是字母字符,但在第二种情况下,它们是数值。
答案 3 :(得分:0)
因为&#39; 0&#39; == 48.字符的值等于ASCII表中的数字。
答案 4 :(得分:0)
在您的代码行中:
/ *使用getchar()后,当你按9而不是得到ASCII 0x30 + 9 = 0x39时,你不会得到C的值为9。* /
1.当你将比较作为:
if (c >= 0 && c <= 9)
++ndigit[c - '0'];
else if (c == ' ' || c == '\n' || c == '\t')
++nwhite;
else
++nother;
/ 您的代码不会传递if为0x39&gt; = 0但不是&lt; = 9 因为它不是&#39; &#39;或者&#39; \ n&#39;或者&#39; \ t&#39;所以它进入了其他部分而其他部分正在增加。 /
2.在下面的案例中:
/ 你的getchar()将收到0x39(9)作为输入,然后你进行比较: /
if (c >= '0' && c <= '9')
/ * c的值是0x39和&#39; 0&#39;等于c> 0x30且c <= 0x39因此满足条件并且您在数字计数器中的该数字位置递增值* /
++ndigit[c - '0'];
else if (c == ' ' || c == '\n' || c == '\t')
++nwhite;
else
++nother;