(在哪里)C 标准定义了 adding/subtracting 两个布尔值的结果?

(Where) does the C standard define the result of adding/subtracting two booleans?

C11 standard_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”可能被解释为逻辑或,但我认为“减法”没有明确定义的含义。

所以问题是:是a+ba-b的结果(其中ab有类型_Bool) C11 中的未定义行为或标准是否明确定义了这些操作的结果(如果是,在哪里?)?

注意:也许标准只是将 _Bool 视为范围很小的整数。在那种情况下,我希望 true+true0(1 + 1 模 2)。然而,GCC says 1.

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

4 If both operands have arithmetic type, the usual arithmetic conversions are performed on them

与(6.3.1.8 常用算术转换)

1 Many operators that expect operands of arithmetic type cause conversions and yield result types in a similar way ...

Otherwise, the integer promotions are performed on both operands.

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

  1. ...If an int can represent all values of the original type (as restricted by the width, for a bit-field), the value is converted to an int; otherwise, it is converted to an unsigned int. These are called the integer promotions. 58) All other types are unchanged by the integer promotions.

因此,当两个操作数都具有 _Bool 类型且在执行运算之前已将整数提升为 int 类型时,加法运算的结果具有类型 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 When any scalar value is converted to _Bool, the result is 0 if the value compares equal to 0; otherwise, the result is 1.