【问题标题】:printf too smart casting from char to int?printf 从 char 到 int 的转换太聪明了?
【发布时间】:2010-10-18 13:34:00
【问题描述】:

为什么会这样调用:

printf("%d %d", 'a', 'b');

导致“正确”97 98 值? %d 表示函数要读取 4 个字节的数据,而 printf 应该无法分辨接收到的参数的类型(除了格式字符串),那么为什么打印的数字不是|a||b||junk||junk|

提前致谢。

【问题讨论】:

  • %d 是一个有符号整数,没有说明所涉及的字节数......
  • @leppie:但是,它必须以一定数量的字节传递,并且printf 必须从堆栈中选择一定数量的字节,并且这些特定的数字必须是一样的。
  • 'a' 的类型为 int 而不是 char

标签: c casting printf byte


【解决方案1】:

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

首先,您传递给 printf 的任何内容(第一个参数除外)都会经历“默认提升”,这意味着(除其他外)charshort 在被传递之前都被提升为 int。因此,即使您传递的内容确实具有 char 类型,当它到达 printf 时,它也将具有 int 类型。在您的情况下,您使用的是字符文字,无论如何它已经具有 int 类型。

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

其次,即使没有默认提升,C 中的字符文字也已经具有 int 类型(第 6.4.4.4/10 节):

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

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

char a = 'a';

printf("%d", a);

...printf 接收的内容将是 int 类型,而不是 char 类型。

【讨论】:

  • 默认促销?真的吗?从什么时候开始可变参数做默认促销?不就是字符文字的类型是int吗?
  • Yes and no -- 是的,char 文字的类型为int,但即使他将其分配给char 并通过它,printf 仍会收到int,所以这几乎无关紧要。
  • 这里没有促销活动。 'a''b' 在 C 中具有 int 类型。
  • @R:哎呀,谢谢!我敢肯定这里没有其他人注意到这样的事情。 幽默障碍者的隐藏字幕:如果“@R”费心阅读以前的 cmets,他会看到其他人在几周前就注意到了——而且我已经指出了这一点/它是怎么回事无关紧要。
  • @R.. 你的观点迫使我问另一个问题:为什么printf("%d", (char)'a'); 工作正常? printf 是否也绕过强制?做启蒙。 :)
【解决方案2】:

C 中,字符字面量是int 类型的值。

【讨论】:

    【解决方案3】:

    它为您输入的字符打印 DEC ASCII。

    【讨论】:

      猜你喜欢
      • 2010-10-29
      • 1970-01-01
      • 2012-11-15
      • 2014-12-04
      • 1970-01-01
      • 2017-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多