C中“==”运算符的返回值

时间:2013-08-07 08:05:36

标签: c

我可以假设在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 个答案:

答案 0 :(得分:36)

  

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

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

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

  

每个运营商&lt; (小于),&gt; (大于),&lt; =(小于或等于),&gt; =   (大于或等于)如果指定的关系为真,则应为1,如果为,则为0   false.107)结果的类型为int。

答案 1 :(得分:10)

来自标准:

  

6.5.8关系运营商

     

每个运营商&lt; (小于),&gt; (大于),&lt; =(小于或等于),&gt; =   如果指定的关系为真,则(大于或等于)将产生 1 ,如果为假,则为0。结果的类型为 int

     

6.5.9平等运营商

     

== (等于)和!=(不等于)运算符类似于关系   运营商除了优先级较低外。 每个运营商产生1 如果   指定的关系为true,如果为false则为0。结果的类型为 int 。对于任何一对   操作数,其中一个关系是真的。

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

  

6.5.13逻辑AND运算符(或6.5.14逻辑OR运算符)

     

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

您可以在此处查看最后草稿:http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf

结论:

  • 所有相等和关系运算符(==!=<><=>=)返回0false1true

  • 逻辑运算符(==||!)将0视为false,将其他值视为true他们的操作。他们还将0作为false1作为true返回。

答案 2 :(得分:9)

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

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

答案 3 :(得分:1)

  

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

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

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

  

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