printf中的默认参数提升和“%c”的相关性

时间:2015-02-28 13:34:03

标签: c printf variadic-functions

以下是关于可变函数的libc所说的内容:

  

由于原型未指定可选参数的类型,因此在调用可变参数函数时,将对可选参数值执行默认参数提升。这意味着char或short int类型的对象(无论是否有符号)被提升为int或unsigned int,视情况而定;并且float类型的对象被提升为double类型。因此,如果调用者将char作为可选参数传递,则将其提升为int

那么,为什么有人会在printf中使用"%c""%hd"?他们应该使用"%d"

我也看到float没有格式说明符。 float必须与%f一起使用double因为促销,因此无法接收浮动作为可变参数。

我知道scanf,参数是指针,没有促销。

我是否有任何理由错过"%c"的{​​{1}}为什么以及何时必须存在printf

1 个答案:

答案 0 :(得分:4)

  

然后,为什么有人会使用"%c"或"%hd"在printf?他们应该只使用"%d"。

可以使用%c将整数解释为其字符代码(即打印'A'而不是65)。可以使用%hd指示printf删除short的上半部分,这些部分可能已作为符号扩展传入的短值的一部分添加。两种格式都提供了另​​一种解释int

  

我也看到float没有格式说明符。

这是正确的:由于该值已提升为double,因此无需单独的标记。