[英](Where) does the C standard define the result of adding/subtracting two booleans?
C11 标准将_Bool
类型(6.2.5.2)定义为标准无符号 integer 类型(6.2.5.6),当我阅读标准时, _Bool
也是一种算术类型(6.2.5.18 通过 6.2.5.7 和 6.2.5.17) .
此外,指定对于+
和-
“两个操作数都应具有算术类型,或者一个操作数应是指向完整 object 类型的指针,而另一个应具有 integer 类型”(6.5.6.2)。
但是,关于结果,我只能看到“二元 + 运算符的结果是操作数之和”(6.5.6.5)和“二元 - 运算符的结果是第二个操作数减去第一个”(6.5.6.6)。 对于两个布尔值,“和”可以解释为逻辑或,但我认为“减法”没有明确定义的含义。
所以问题是: a+b
和ab
(其中a
和b
具有类型_Bool
)的结果是 C11 中未定义的行为,还是标准明确定义了这些操作的结果(如果是,在哪里?)?
注意:也许标准只是将_Bool
视为 integer 范围很小。 在这种情况下,我希望true
+ true
为0
(1 + 1 模 2)。 但是, GCC 说 1 。
它来自第 6.3.1.2 节:
当任何标量值转换为 _Bool 时,如果该值比较等于 0,则结果为 0; 否则,结果为 1)
因此该操作是使用普通的无符号算术完成的,然后将结果转换为_Bool
,它将任何非零结果映射到1
。
来自 C 标准(6.5.6 加法运算符)
4 如果两个操作数都具有算术类型,则对它们执行通常的算术转换
和(6.3.1.8 常用算术转换)
1 许多期望算术类型的操作数的运算符会导致转换并以类似的方式产生结果类型......
否则,对两个操作数都执行 integer 提升。
和(6.3.1.1 Boolean,字符和整数)
- ...如果 int 可以表示原始类型的所有值(受宽度限制,对于位域),则该值将转换为 int; 否则,它将转换为无符号整数。 这些被称为 integer 促销活动。 58) integer 促销活动未更改所有其他类型。
因此,当两个操作数的类型_Bool
(integer)在执行操作之前提升为int
类型时,加法运算的结果的类型为int
。
请注意,在 C 中没有 boolean 类型,如 C++ 中的类型。 boolean 类型_Bool
是 C 中的标准无符号 integer 类型,可以存储1
或0
。
所以如果你会写例如
_Bool a = 1;
_Bool b = 1;
_Bool c = a + b;
那么变量 c 的值将是 1,因为任何非零值(并且操作的结果是int
类型的值 2)都将转换为 1。
从 C 标准
6.3.1.2 Boolean 型
1 任何标量值转换为_Bool时,如果值比较等于0则结果为0; 否则,结果为 1。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.