【问题标题】:default argument promotions and relevance of "%c" in printfprintf 中“%c”的默认参数提升和相关性
【发布时间】:2015-05-01 04:20:46
【问题描述】:

以下是libc 对可变参数函数的看法:

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

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

我还看到float 没有格式说明符。 float 必须与 %f 一起使用,double 由于促销活动,不可能接收浮点数作为可变参数。

我知道scanf,参数是指针,不会发生任何提升。

我有什么理由错过"%c" 必须存在于printfs 的原因和时间?

【问题讨论】:

  • 什么是“libc”?
  • 请编辑您的评论以删除归属。我在问原因,周围有很多 C 库的实现。你指的是哪一个?您应该正确引用您的来源。
  • %hd 代表short,我想你的意思是%hhd
  • @JensGustedt 是的,当然。我看错了

标签: c printf variadic-functions


【解决方案1】:

那么,为什么会有人在 printf 中使用 "%c" 或 "%hd" 呢?他们应该只使用“%d”。

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

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

没错:由于值已提升为double,因此不需要单独的标志。

【讨论】:

    猜你喜欢
    • 2020-09-02
    • 2010-11-18
    • 1970-01-01
    • 2020-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-25
    相关资源
    最近更新 更多