printf太聪明了从char到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。
因此,在这种情况下,值以int
类型开头,并且不会被提升 – 但即使您以char
开头,例如:
char a = 'a'; printf("%d", a);
… printf
接收的是int
类型,而不是类型char
。
在C
,char literal是int
类型的值。
它会为您输入的字符打印DEC ASCII。