2013-08-07 50 views
21

我可以假设在C中,如果两个值相等或它可以计算为其他“真”值,那么“==”运算符总是计算为1?C中的“==”运算符的返回值

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,或者它可以返回其他值吗?

+1

请参阅http://port70.net/~nsz/c/c11/n1570.html#6.5.9p3 – Christoph

回答

29

我可以假设在C中,如果两个值相等或它可以计算为其他“真”值,那么“==”运算符总是会计为1?

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

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

每个运营商<(小于),>(大于),< =(小于或等于的如果指定的关系为真,则> = (大于或等于)应产生1,如果为 则为0)结果的类型为int。并且没有其他的值 -

9

比较(平等和关系)运算符(==!=<><=>=)所有用于真假和1返回0。

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

1

我可以假设在C中,如果两个值相等或它可以评估为其他“真”值,那么“==”运算符总是计算为1?

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

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

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

9

从标准:

6.5.8关系运算符

每个运营商<(小于),>(大于),< =(小于或等于的如果指定的关系为真,> = (大于或等于)将产生,如果为假,则产生0。结果有int

6.5.9相等运算

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

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

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

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

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

结论:

  • 所有平等,关系运算符(==!=<><=>=)回报0 for false and 1 for true

  • 逻辑运算符(==||!)治疗对它们的操作数0false和其它值true。他们还将0作为false1作为true返回。