我们知道C中的条件,例如a > b
,会导致0或1.如果我们想直接在表达式中使用此0
/ 1
值,例如1 - (a > b)
,我们应该假设它是有符号的还是无符号的(因为它可以对表达式产生影响)?标准对此有何看法?
答案 0 :(得分:9)
所有关系运算符的结果类型为int
:
C11§6.5.8关系运算符
每个运算符
<
(小于),>
(大于),<=
(小于或等于)和>=
(大于或等于)如果指定的关系为真,则产生1
,如果为假,则产生0
。 结果的类型为int。
因此1 - (a > b)
的类型也是int
,是签名类型。
答案 1 :(得分:4)
标准很清楚。所有关系运算符(包括相等和非相等)的计算结果为0或1,即int
类型。
a > b
大于a
, b
将评估为1,否则为0。
1 - (a > b)
是一个类型为int
的表达式。
答案 2 :(得分:0)
在条件的结果中始终是int。布尔值true
和false
的值不太清楚。在c89标准中,仅清楚false等于零,而true
仅定义为不等于零的值。因此,在旧的C89系统中,您可以按如下方式定义true和false:
#define FALSE (0)
#define TRUE !(FALSE)
但是,如果true始终为1且false始终为0,则取决于编译器,因为true
和false
未由C89标准定义。所以你不能依赖于比较的结果(true
)总是1,因为它可能是任何不同于0的int值。
这就是为什么应该避免与true
进行布尔比较的原因,而应该首选与false
的比较。
C99标准引入了_Bool
类型。在此标准中,true
定义为1,false
定义为0.符合C99的编译器不应具有true
的其他值作为条件的结果。但在内部,它仍然是一个签名的int。但是要确保应该读取编译器的规范,因为如果编译器没有完全实现C99标准,那么true
的结果可能仍然不是1.