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

基于ISO C规范:C语言中bool类型的文件I/O是否可按int处理?

关于将bool变量当作int进行文件I/O的规范分析

针对你给出的代码片段,基于ISO C(C99及后续版本)规范,分两部分分析:

1. fprintf(fp1, "%d", b); 符合规范

C99引入了_Bool类型,<stdbool.h>头文件中定义的bool是_Bool的typedef。根据整数提升规则,_Bool类型的变量在作为函数参数传递时会被隐式提升为int类型——true对应1,false对应0。而fprintf的%d转换说明符要求参数为int类型,因此这段代码的行为是明确且符合规范的,会正确输出1或0。

2. fscanf(fp2, "%d", &b); 不符合规范,属于未定义行为

fscanf的%d转换说明符要求对应的参数是指向int类型的指针(int*),但这里传递的是&b,其类型为bool*(即_Bool*)。根据ISO C规范,当转换说明符对应的指针类型与实际传递的指针类型不兼容时,行为是未定义的。

虽然在某些编译器下这段代码可能“正常工作”,但这只是特定实现的行为,并非标准所保证。正确的做法是先用一个int变量接收输入,再转换为bool类型:

int temp;
if (fscanf(fp2, "%d", &temp) == 1) {
    b = (temp != 0);
}

内容的提问来源于stack exchange,提问作者apadana

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 07:07:04