C11 标准将_Bool
类型(6.2.5.2)定义为标准的无符号整数类型 (6.2.5.6),当我阅读标准时,_Bool
也是一个算术类型(6.2.5.18 到 6.2.5.7 和 6.2.5.17)。
此外,还规定对于+
和-
"两个操作数都应具有算术类型,或者一个操作数应是指向完整对象类型的指针,另一个操作数应具有整数类型"(6.5.6.2)。
但是,关于结果,我只能看到"二进制 + 运算符的结果是操作数的总和"(6.5.6.5)和"二进制 - 运算符的结果是从第一个操作数中减去第二个操作数所产生的差值"(6.5.6.6)。对于两个布尔值,"sum">可以解释为逻辑OR,但我认为"减法"没有明确定义的含义。
所以问题是:C11 中a+b
和a-b
(其中a
和b
具有类型_Bool
)的结果是未定义的行为,还是标准明确定义了这些操作的结果(如果是,在哪里?
注意:也许标准只是将_Bool
视为范围非常小的整数。在这种情况下,我希望true
+true
是0
(1 + 1模2)。但是,海湾合作委员会说 1.
来自 C 标准(6.5.6 加法运算符)
4 如果两个操作数都有算术类型,则通常的算术 对它们执行转换
和(6.3.1.8 常用算术转换)
1 许多期望算术类型操作数的运算符导致 以类似的方式计算转化和收益结果类型 ...
否则,将对两个操作数执行整数提升。
和(6.3.1.1 布尔值、字符和整数)
- ...如果 int 可以表示原始类型的所有值(受限制 对于位字段的宽度),该值将转换为 int; 否则,它将转换为无符号的 int。这些被称为 整数促销。58)所有其他类型均保持不变促销。
因此,当两个操作数都具有在执行运算之前提升为整数int
类型的_Bool
时,加法运算的结果具有int
类型。
请注意,在 C 中没有像 C++ 中那样的布尔类型。布尔类型_Bool
是 C 中的标准无符号整数类型,可以存储1
或0
。
所以如果你会写例如
_Bool a = 1;
_Bool b = 1;
_Bool c = a + b;
然后变量 c 的值将为 1,因为任何非零值(运算结果是类型int
的值 2)都转换为 1。
从 C 标准
6.3.1.2 布尔类型
1 当任何标量值转换为 _Bool 时,如果 值比较等于 0;否则,结果为 1。