c - printf 从 char 到 int 的转换太聪明了?

标签 c casting printf byte

为什么会出现以下调用:

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

得到“正确的”97 98 值? %d 表示函数必须读取 4 个字节的数据,而 printf 应该无法分辨接收到的参数的类型(格式字符串除外),所以为什么打印的数字不是 |a|| b||垃圾||垃圾|?

提前致谢。

最佳答案

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

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

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

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

An integer character constant has type int.

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

char a = 'a';

printf("%d", a);

...printf 接收到的是 int 类型,而不是 char 类型。

关于c - printf 从 char 到 int 的转换太聪明了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3959674/

相关文章:

c++ - 想在某个未知系统上运行程序

c++ - 从成员指针转换为整个结构/类

mysql - mysql 中奇怪的转换行为

c - 在 C 中格式化 float

c - GL_REPEAT 和 GL_CLAMP 给出相同的结果

c - 使用指针的字符串长度

c - 如何通过引用函数传入数组?

java - 执行variableOfTypeA+=variableOfTypeB时出现奇怪的类型转换

c - `printf()` 如何区分浮点参数和整数类型参数?

c - 在格式化的 printf 中使用 #define 来定义精度