(其中)C 标准是否定义了加/减两个布尔值的结果?



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+ba-b(其中ab具有类型_Bool)的结果是未定义的行为,还是标准明确定义了这些操作的结果(如果是,在哪里?

注意:也许标准只是将_Bool视为范围非常小的整数。在这种情况下,我希望true+true0(1 + 1模2)。但是,海湾合作委员会说 1.

来自 C 标准(6.5.6 加法运算符)

4 如果两个操作数都有算术类型,则通常的算术 对它们执行转换

和(6.3.1.8 常用算术转换)

1 许多期望算术类型操作数的运算符导致 以类似的方式计算转化和收益结果类型 ...

否则,将对两个操作数执行整数提升

和(6.3.1.1 布尔值、字符和整数)

  1. ...如果 int 可以表示原始类型的所有值(受限制 对于位字段的宽度),该值将转换为 int; 否则,它将转换为无符号的 int。这些被称为 整数促销。58)所有其他类型均保持不变促销

因此,当两个操作数都具有在执行运算之前提升为整数int类型的_Bool时,加法运算的结果具有int类型。

请注意,在 C 中没有像 C++ 中那样的布尔类型。布尔类型_Bool是 C 中的标准无符号整数类型,可以存储10

所以如果你会写例如

_Bool a = 1;
_Bool b = 1;
_Bool c = a + b;

然后变量 c 的值将为 1,因为任何非零值(运算结果是类型int的值 2)都转换为 1。

从 C 标准

6.3.1.2 布尔类型

1 当任何标量值转换为 _Bool 时,如果 值比较等于 0;否则,结果为 1。

最新更新