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
相关产品推荐
相关产品推荐

