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

C标准中两个_Bool类型值加减运算结果的定义位置是哪里?

结论

a和b均为_Bool类型时,a+b和a-b的运算行为在C11标准中有明确定义,不属于未定义行为。

核心规则依据

1. 运算前的整数提升规则

C11标准6.3.1.1节明确规定:所有整数秩低于int的整数类型(_Bool的整数秩为所有整数类型中最低),只要其取值范围可以被int完全覆盖,参与算术运算前会先提升为int类型。
也就是说_Bool类型的操作数不会直接参与运算,会先转为int类型再执行加减操作:

  • 若_Bool值为真,转换为int类型的1
  • 若_Bool值为假,转换为int类型的0

2. 加减运算规则

_Bool操作数提升为int后,加减运算完全遵循普通整数运算规则,运算结果的类型为int:

  • 两个真值_Bool相加,等价于1 + 1,得到int类型的2
  • 真值减真值,等价于1 - 1,得到int类型的0
  • 假值减真值,等价于0 - 1,得到int类型的-1

3. 结果回存_Bool的转换规则

若运算结果需要赋值回_Bool类型,遵循C11 6.3.1.2节的规定:任何标量值转换为_Bool时,原值为0则结果为0,否则结果为1。
你观测到GCC中true + true结果为1,是因为运算结果被赋值回了_Bool类型:int类型的2转换为_Bool时非0,所以得到1,完全符合标准要求。

对应标准条款位置

  • 6.2.5 类型:明确_Bool为标准无符号整数类型、属于算术类型
  • 6.3.1.1 布尔、字符和整数:规定_Bool的整数秩与整数提升规则
  • 6.3.1.2 布尔类型转换:规定其他类型转_Bool的规则
  • 6.3.1.8 普通算术转换:规定算术运算前的类型转换规则
  • 6.5.6 加法运算符:明确加减运算符对算术类型操作数的运算规则

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 05:54:00