30

我可以假设在 C 中,如果两个值相等,“==”运算符将始终计算为 1,或者它可以计算为其他“真”值?

struct ss {
    int id;
};

struct os {
    int sid;
    int state;
};

int count(struct ss *s, int state)
{
    int num = 0;
    // foreach o (of type os*) in a hash table
        num += o->state == state && (s ? o->sid == s->id : 1);

    return num;
}

那么o->sid == s->id将始终返回 1 或 0,还是可以返回其他值?

4

4 回答 4

40

我可以假设在 C 中,如果两个值相等,“==”运算符将始终计算为 1,或者它可以计算为其他“真”值?

是的,!= > < >= <=所有关系运算符也是如此。

C11(ISO/IEC 9899:201x) §6.5.8关系运算符

如果指定的关系为真,则每个运算符 <(小于)、>(大于)、<=(小于或等于)和 >=(大于或等于)应产生 1,如果是,则应产生 0 false.107) 结果的类型为 int。

于 2013-08-07T08:08:40.433 回答
12

从标准:

6.5.8 关系运算符

如果指定的关系为真,则每个运算符 <(小于)、>(大于)、<=(小于或等于)和 >=(大于或等于)应产生1,如果是,则应产生 0错误的。结果的类型为int

6.5.9 等式运算符

==(等于)和 !=(不等于)运算符类似于关系运算符,只是它们的优先级较低。如果指定的关系为真,则每个运算符产生 1,如果为假,则产生 0。结果的类型为int。对于任何一对操作数,其中一个关系是正确的。

对于逻辑操作数 ( &&, ||) :

6.5.13 逻辑与运算符(或 6.5.14 逻辑或运算符)

&&(或||)运算符如果两个操作数比较不等于 0,则应产生 1 ;否则,它产生 0。结果具有 int 类型。

你可以在这里查看最后的草稿:http ://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf

结论 :

  • 所有等式和关系运算符 ( ==, !=, <, >, <=, >=) 返回0forfalse1for true

  • 逻辑运算符 ( ==, ||, !) 将0asfalse和其他值视为true其操作数。它们也返回0asfalse1as true

于 2013-08-07T08:14:40.137 回答
10

比较(相等和关系)运算符(==, !=, <, >, <=, >=)都返回 0 表示 false 和 1 表示 true - 并且没有其他值。

逻辑运算符&&,||!对它们的操作数不那么挑剔;他们将 0 视为 false,将任何非零值视为 true。但是,它们也只返回 0 表示 false 和 1 表示 true。

于 2013-08-07T08:09:23.533 回答
2

我可以假设在 C 中,如果两个值相等,“==”运算符将始终计算为 1,或者它可以计算为其他“真”值?

是的,对于符合标准的编译器,这个假设是正确的:

编程语言——C,§6.5.9 等式运算符http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf):

如果指定的关系为真,则每个运算符产生 1,如果为假,则产生 0。结果的类型为 int。

于 2013-08-07T08:09:55.010 回答