printf从char到int的转换是否太聪明?
为什么以下调用:printf从char到int的转换是否太聪明?,c,casting,printf,byte,C,Casting,Printf,Byte,为什么以下调用: printf("%d %d", 'a', 'b'); 结果是否为“正确”97 98值? %d表示函数必须读取4个字节的数据,printf应该不能告诉接收参数的类型(除了格式字符串),那么为什么打印的数字不是|a | | b | junk | junk | 提前感谢。在这种情况下,printf接收的参数将是int类型 首先,传递给printf的任何内容(第一个参数除外)都会经历“默认升级”,这意味着(除其他外)char和short在传递之前都会升级为int。因此,即使您正在传递
printf("%d %d", 'a', 'b');
结果是否为“正确”97 98
值?
%d表示函数必须读取4个字节的数据,printf应该不能告诉接收参数的类型(除了格式字符串),那么为什么打印的数字不是|a | | b | junk | junk |
提前感谢。在这种情况下,
printf
接收的参数将是int
类型
首先,传递给printf的任何内容(第一个参数除外)都会经历“默认升级”,这意味着(除其他外)char
和short
在传递之前都会升级为int
。因此,即使您正在传递的内容确实有char类型,当它到达printf
时,它也会有int
类型。在本例中,您使用的是一个字符文本,它的类型已经是int
scanf和其他采用可变参数的函数也是如此
第二,即使没有默认提升,C中的字符文字也已经具有类型int
(§6.4.4.4/10):
整型字符常量的类型为int
因此,在本例中,值以typeint
开头,并且不会被提升——但即使是以char
s开头,也会出现如下情况:
char a = 'a';
printf("%d", a);
“
printf
接收的是int
类型,而不是char
类型。在C
中,char-literal是int
类型的值,它为您输入的字符打印DEC ASCII。%d是一个有符号整数,不涉及字节数…@leppie:然而,它必须以一定数量的字节传递,并且printf
必须从堆栈中为它选取一定数量的字节,并且这些特定的数字必须相同。'a'
具有类型int
而不是char
。默认升级?真正地varargs什么时候开始执行默认促销?不仅仅是字符文本的类型是int
?是和否——是的,字符文本的类型是int
,但即使他将其分配给char
,并传递该值,printf
仍会收到int
,因此这几乎是不相关的。这里没有促销活动<代码>'a'和'b'
在C中输入int
。@R:Gee,谢谢!我相信这里没有其他人注意到这样的事情。幽默受损者的封闭式字幕:如果“@R”费心阅读之前的评论,他会发现其他人在几周前就注意到了这一点——我已经指出了这一点。@R。。你的观点迫使我问另一个问题:为什么printf(“%d”,(char)“a”)代码>工作正常吗?printf
是否也绕过强制?请开导。:)