You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 18:13:21