现在我写下代码......
#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()转换字符。不知怎的,它有效!那么让它发挥作用的原因是什么呢?
答案 0 :(得分:0)
答案分为两部分。
您输入了
c = getchar();
但getchar
明确返回字符,那么这怎么办?好吧,实际上,它工作正常,部分原因是getchar
的返回值实际上是int
(因此它也可以返回非char
值EOF
)。所以这里根本没有问题。
然后,如何通过int
传递%c
?通常,当您调用printf
时,它对您传递的参数类型很重要,以正确匹配格式说明符所期望的类型。 (例如,传递int
并尝试使用%f
打印它是一个真正的错误。)但是C并不总是将类型传递给函数,就像编写它们一样,有时他们会转换(&#34;晋升&#34;)为更大的普通类型。
这些转换适用的次数(并且,在现代C中,几乎是唯一的时间)是当您调用带有可变数量参数的函数时,例如printf
。在这种情况下,当您传递char
或short int
类型的参数时,它会自动上转换为int
。因此,使用int
打印%c
值很好。 (另一项重要的促销活动是,当您传递float
时,它会自动转换为double
。结果您可以同时打印float
和double
使用%f
。)
事实上,在C中,字符实际上是小整数,所以这一点都不令人惊讶。一种看待这种情况的方法是稍微改变你的printf电话:
printf("I waited for the %d character\n", c);
现在,如果您输入A
,它会告诉您它有65,因为在ASCII中,资本A的代码是65.
答案 1 :(得分:-1)
在ascii表中,任何字符值都有一个等价的整数。因此,如果将字符值放入整数变量,则会为该字符值分配等效的整数。