Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
printf从char到int的转换是否太聪明?_C_Casting_Printf_Byte - Fatal编程技术网

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

因此,在本例中,值以type
int
开头,并且不会被提升——但即使是以
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
是否也绕过强制?请开导。:)