[英]Why char specified as integer in printf gets printed correctly
为什么以下代码有效?
char c = 'A';
printf("%d - size: %d", c, sizeof(c));
打印出来:
65 - size: 1
为什么输出不是垃圾,因为int通常是4个字节长,我们可以清楚地看到char是1个字节长。 编译器是否进行隐式对话?
任何低于int
整数类型都会在表达式中使用时提升为int
或unsigned int
。 这在C标准的6.3.1.1p2节中规定:
如果可以使用int或unsigned int,则可以在表达式中使用以下内容:
- 具有整数类型(int或unsigned int除外)的对象或表达式,其整数转换等级小于或等于int和unsigned int的等级。
- _Bool,int,signed int或unsigned int类型的位字段。
如果int可以表示原始类型的所有值(由宽度限制,对于位字段),则该值将转换为int; 否则,它将转换为unsigned int。 这些被称为整数促销。
整数促销不会更改所有其他类型
这就是在这种情况下发生的事情,因为printf
函数在编译时不会隐式地知道其参数的类型。 所以char
参数被提升为int
,并使用%d
来格式化它是有效的。
对于具有可变长度参数列表的函数,有一个特殊规则,如printf
。 在参数列表的可变长度部分中,小于int
所有整数参数都被提升为int
,而float
被提升为double
。 所以事实证明使用%d
打印字符(或short
)是完全没问题的。
这些默认参数促销最终会导致printf
的许多异常。 您可能认为char
, short
, int
, float
和double
的正确格式说明符分别是%hhd
, %hd
, %d
, %f
和%lf
。 但实际上你可以逃脱%d
, %d
, %d
, %f
和%f
。 printf
基本上忽略了浮点数的l
修饰符,它似乎忽略了整数的h
修饰符。 (实际上, h
可以在不明显的案例中发挥作用,正如chux在评论中解释的那样。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.