单引号vs C中没有引用

时间:2015-11-16 13:18:50

标签: c char

在以下代码中:

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;。

5 个答案:

答案 0 :(得分:3)

'0'是0x30的字节,'9'是0x39。但09只是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;