以下是关于可变函数的libc
所说的内容:
由于原型未指定可选参数的类型,因此在调用可变参数函数时,将对可选参数值执行默认参数提升。这意味着char或short int类型的对象(无论是否有符号)被提升为int或unsigned int,视情况而定;并且float类型的对象被提升为double类型。因此,如果调用者将char作为可选参数传递,则将其提升为int
那么,为什么有人会在printf中使用"%c"
或"%hd"
?他们应该使用"%d"
。
我也看到float
没有格式说明符。 float
必须与%f
一起使用double
因为促销,因此无法接收浮动作为可变参数。
我知道scanf
,参数是指针,没有促销。
我是否有任何理由错过"%c"
的{{1}}为什么以及何时必须存在printf
?
答案 0 :(得分:4)
然后,为什么有人会使用"%c"或"%hd"在printf?他们应该只使用"%d"。
可以使用%c
将整数解释为其字符代码(即打印'A'
而不是65)。可以使用%hd
指示printf
删除short
的上半部分,这些部分可能已作为符号扩展传入的短值的一部分添加。两种格式都提供了另一种解释int
。
我也看到
float
没有格式说明符。
这是正确的:由于该值已提升为double
,因此无需单独的标记。