否定 &&(逻辑与)运算的结果是否安全?

Is it safe to negate the result of an && (logical and) operation?

我隐约知道布尔运算符的return类型在C中是int,但它保证是原汁原味的int,而不是unsigned int?

我通常担心是否允许我否定布尔运算的结果并期望它是 0-1,而不是 2^32 - 1。请参阅以下示例:

int main(void) {
    int a = -(5 == 5);
    // Is "a" guaranteed to be -1 here?
}

比较和逻辑运算符的结果是类型 int 的值 01int 指定至少包含整数范围 [−32,767, +32,767]。

-(5 == 5) 因此总是 -1,而 -(5 == 4) 总是 0

然而,这样做是令人困惑的。这些运算符的结果通常以类似布尔的方式处理,使用结果的数值可能会使代码更难理解。

使用三元运算符可能会使意图更加明确:

(5 == num) ? -1 : 0

Compiler Explorer 上使用了多个编译器,我没有发现生成的代码有什么不同。

参见 C11 6.5.8 and C11 6.5.9

是的,运算符 == 产生类型 int 的结果,值为 01.