我可以假设在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,或者它可以返回其他值吗?
答案 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
结论:
所有相等和关系运算符(==
,!=
,<
,>
,<=
,>=
)返回0
为false
,1
为true
。
逻辑运算符(==
,||
,!
)将0
视为false
,将其他值视为true
他们的操作。他们还将0
作为false
和1
作为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。