为何char类型可通过%d格式符转换?是否符合C标准?
问题:char类型配合printf的%d格式符是否总能得到预期输出?
我发现自己在使用printf的%d格式符时传入了char类型变量,根据C标准,%d格式符应对应int类型参数,参数类型不匹配会导致未定义行为。但编译运行如下代码却总能得到预期输出:
#include <stdio.h> int main(void){ char a= 'A'; // 'A' = 65 in ASCII printf("%c\n", a); printf("%d\n", a); return 0; }
----- output -----
A
65
回答
- 你看到的现象核心是默认参数提升:在C语言里,调用printf这类可变参数函数时,char、short类型的参数会自动被提升为int类型(只要int能容纳原类型的所有取值),unsigned char/short则会提升为unsigned int。
- 你的代码里,char类型的变量
a传入printf时已经被提升成了int类型,完全匹配%d格式符要求的参数类型,这种情况下行为是符合C标准的,可以始终预期得到正确输出。 - 这里不存在未定义行为,因为参数在传入前已经完成了类型提升,实际传递的是int类型的值,和
%d的要求一致。
内容的提问来源于stack exchange,提问作者kanoo12
相关产品推荐
相关产品推荐

