#include <stdio.h>
int main(void)
{
char i=49;
printf("%d",i);
return 0;
}
为什么输出是49?
我使用%d
打印字符,而我的字符声明也是错误的。
答案 0 :(得分:1)
在C中,char
表示与字节相同的东西;它是最小的可寻址内存块,也是最小的整数类型。 49是具有值int
的类型49
的整数常量。 '1'
是一个字符常量,也有int
类型!并在ASCII系统'1'
上作为值49(字符1
的ASCII代码)。
printf
转换说明符%d
期望相应的参数为int
,然后以十进制表示法打印其值。格式字符串后面的其余参数受默认参数提升的约束;每个小于int
的整数类型都会提升为int
;并且float
被提升为double
。由于i
的整数类型小于int
,因此其值(49)现在被提升为int和printf
,它看起来与给出任何其他整数值49完全相同
要打印字符代码为49
的字符,您需要使用%c
转换说明符;然后printf
将输出1
,这是代码49的字符;即使是现在,论证也会提升为int
,printf
会在内部将该值转换为 unsigned char
,然后输出(source):
c
[...]
int
参数转换为unsigned char,并写入结果字符。 [...]
附录:代码
char i = 49.012;
printf("%f", i);
49.012
是double
类型的值;通过砍掉小数将其转换为char范围整数,因此i
中存储的值再次 ;哪一个可以用%d
打印来证明。现在,%f
期望相应的参数的类型为double
,但i
会转换为int
;在调用printf
时使用错误类型的参数具有未定义的行为,即任何事情都可能发生。如果使用gcc -Wall
进行编译,则会产生以下错误:
警告:格式
%f
需要double
类型的参数,但参数2的类型为int
[-Wformat =]
答案 1 :(得分:0)
根据评论更新答案。
char是integer
类型,您为此整数类型指定49。 %d转换说明符打印整数值;
char i=49;
如果使用"%c"
进行打印,则可以看到ascii值为49的相应字符,即1
由于您使用"%d"
,因此您将获得整数值。
你可以试试这个
char i='1';
现在尝试printf("%d",i);
您将获得49
答案 2 :(得分:0)
%d,%c,%o,%x ...这些称为格式说明符。它将决定你想要的输出类型。
在您的示例中,您为我分配了49并向编译器说您希望输出为十进制。
如果您尝试通过用%c替换%d来打印它,那么它将打印
1因为它假定输出应该以等价于给定数字的char的形式打印
其中ASCII表49为1
和FYI
在printf函数的实现中,它们将处理'%'符号,后跟字符作为特例
如果后面的字符有效,那么它将输出
%x是十六进制 %d是十进制 %i是整数 %c是字符 %s是字符串 %f是浮点数 ...............等 你可以google“c中的形式说明符”,会有很多结果
希望此信息对您有用。