为什么会出现以下调用:
printf("%d %d", 'a', 'b');
得到“正确的”97 98
值?
%d 表示函数必须读取 4 个字节的数据,而 printf 应该无法分辨接收到的参数的类型(格式字符串除外),所以为什么打印的数字不是 |a|| b||垃圾||垃圾|
?
提前致谢。
最佳答案
在这种情况下,printf
接收到的参数将是 int
类型。
首先,您传递给 printf 的任何内容(第一个参数除外)都会进行“默认提升”,这意味着(除其他事项外)char
和 short
是在通过之前都提升为 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/