条件评估为有符号或无符号整数?

时间:2015-11-03 12:52:22

标签: c conditional-statements language-lawyer

我们知道C中的条件,例如a > b,会导致0或1.如果我们想直接在表达式中使用此0 / 1值,例如1 - (a > b),我们应该假设它是有符号的还是无符号的(因为它可以对表达式产生影响)?标准对此有何看法?

3 个答案:

答案 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。布尔值truefalse的值不太清楚。在c89标准中,仅清楚false等于零,而true仅定义为不等于零的值。因此,在旧的C89系统中,您可以按如下方式定义true和false:

#define FALSE (0)
#define TRUE !(FALSE)

但是,如果true始终为1且false始终为0,则取决于编译器,因为truefalse未由C89标准定义。所以你不能依赖于比较的结果(true)总是1,因为它可能是任何不同于0的int值。

这就是为什么应该避免与true进行布尔比较的原因,而应该首选与false的比较。

C99标准引入了_Bool类型。在此标准中,true定义为1,false定义为0.符合C99的编译器不应具有true的其他值作为条件的结果。但在内部,它仍然是一个签名的int。但是要确保应该读取编译器的规范,因为如果编译器没有完全实现C99标准,那么true的结果可能仍然不是1.