为什么字符值存储在整数?

时间:2018-04-06 18:06:59

标签: c

现在我写下代码......

#include <stdio.h>
int main()

    {
        int c;
        printf("I'm waiting for a character: ");
        c = getchar();
        printf("I waited d for the '%c' character\n", c);
        return 0;
    }

如你所见,我已将c声明为整数,因此该值应该在0-9中,但是接下来的第3行我只使用了char类型值的printf()转换字符。不知怎的,它有效!那么让它发挥作用的原因是什么呢?

2 个答案:

答案 0 :(得分:0)

答案分为两部分。

您输入了

c = getchar();

getchar明确返回字符,那么这怎么办?好吧,实际上,它工作正常,部分原因是getchar的返回值实际上是int(因此它也可以返回非charEOF )。所以这里根本没有问题。

然后,如何通过int传递%c?通常,当您调用printf时,它对您传递的参数类型很重要,以正确匹配格式说明符所期望的类型。 (例如,传递int并尝试使用%f打印它是一个真正的错误。)但是C并不总是将类型传递给函数,就像编写它们一样,有时他们会转换(&#34;晋升&#34;)为更大的普通类型。

这些转换适用的次数(并且,在现代C中,几乎是唯一的时间)是当您调用带有可变数量参数的函数时,例如printf。在这种情况下,当您传递charshort int类型的参数时,它会自动上转换为int。因此,使用int打印%c值很好。 (另一项重要的促销活动是,当您传递float时,它会自动转换为double。结果您可以同时打印floatdouble使用%f。)

事实上,在C中,字符实际上是小整数,所以这一点都不令人惊讶。一种看待这种情况的方法是稍微改变你的printf电话:

printf("I waited for the %d character\n", c);

现在,如果您输入A,它会告诉您它有65,因为在ASCII中,资本A的代码是65.

答案 1 :(得分:-1)

在ascii表中,任何字符值都有一个等价的整数。因此,如果将字符值放入整数变量,则会为该字符值分配等效的整数。