printf太聪明了从char到int?

Hil*_*ter 8 c printf byte casting

为什么以下电话:

printf("%d %d", 'a', 'b');
Run Code Online (Sandbox Code Playgroud)

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

提前致谢.

Jer*_*fin 15

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

首先,你传递给printf的任何东西(第一个参数除外)都会经历"默认促销",这意味着(除其他外)char并且在传递之前都被short提升int.所以,即使你传递的内容真的有char类型,到printf它时它也会有类型int.在你的情况下,你正在使用一个已经有类型的字符文字int.

scanf和其他采用可变参数的函数也是如此.

其次,即使没有默认促销,C中的字符文字int仍然具有类型(§6.4.4.4/ 10):

整数字符常量的类型为int.

因此,在这种情况下,值以类型开头int,并且不会被提升 - 但即使您以chars 开头,例如:

char a = 'a';

printf("%d", a);
Run Code Online (Sandbox Code Playgroud)

... printf接收的类型int,而不是类型char.

  • 是和否 - 是的,char文字的类型是`int`,但即使他将它分配给`char`并传递了它,'printf`仍然会收到`int`,所以它几乎无关紧要. (4认同)
  • 这里没有促销活动.`'a'`和`'b'`在C中输入`int`. (3认同)