printf太聪明了从char到int?

为什么以下电话:

printf("%d %d", 'a', 'b'); 

导致“正确” 97 98值? %d表示函数必须读取4个字节的数据,而printf不能告诉接收到的参数的类型(格式字符串除外),为什么不打印数字|a||b||junk||junk|

提前致谢。

在这种情况下, printf接收的参数将是int类型。

首先,传递给printf的任何内容(第一个参数除外)都经历“默认促销”,这意味着(除其他外) charshort在传递之前都被提升为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。