(在哪里)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+b
和a-b
的结果(其中a
和b
有类型_Bool
) C11 中的未定义行为或标准是否明确定义了这些操作的结果(如果是,在哪里?)?
注意:也许标准只是将 _Bool
视为范围很小的整数。在那种情况下,我希望 true
+true
为 0
(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 布尔值、字符和整数)
- ...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 中的标准无符号整数类型,可以存储 1
或 0
.
所以如果你会写,例如
_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.
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+b
和a-b
的结果(其中a
和b
有类型_Bool
) C11 中的未定义行为或标准是否明确定义了这些操作的结果(如果是,在哪里?)?
注意:也许标准只是将 _Bool
视为范围很小的整数。在那种情况下,我希望 true
+true
为 0
(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 布尔值、字符和整数)
- ...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 中的标准无符号整数类型,可以存储 1
或 0
.
所以如果你会写,例如
_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.