2013-08-07 11 views
21

Cでは、 "=="演算子は2つの値が等しい場合や、他の "真"の値に評価できる場合、常に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を返します、またはそれは他の値を返すことができますか?

+1

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

答えて

29

"=="演算子は、2つの値が等しいか他の "真"の値に評価できる場合、常に1と評価できますか?

はい、とそう!=><>=<=すべてのリレーショナル演算子はありません。

C11(ISO/IEC 9899:201X)§6.5.8関係演算子

オペレータ<それぞれの(より小さい)、>(より大きい)、< =(以下)、および> = (以上)は、指定された関係が真である場合は1を返し、そうである場合は0を返します。 false.107)結果はint型です。

9

比較(平等との関係)演算子(==!=<><=>=)真のための偽と1のためのすべての戻り0 - なし他の値。

論理演算子&&||!は、そのオペランドについてはあまりうるさいです。 0を偽とみなし、0以外の値を真とみなします。ただし、falseの場合は0、trueの場合は1だけも返します。

1

"=="演算子は、2つの値が等しいか、他の "真"の値に評価できる場合、常に1と評価できますか?

はい、標準準拠のコンパイラでは、この仮定が正しい:言語プログラミング

- C、§6.5.9等価演算子http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf):

オペレータの各々指定されたリレーションがtrueの場合は1を返し、falseの場合は0 を返します。結果はint型です。規格から

9

6.5.8関係演算子

オペレータの各々<(より小さい)、>(より大きい)、< =(以下to)、> = (以上)は、指定された関係が真である場合は、偽の場合は0となります。結果はタイプintです。

6.5.9等価演算子

==(等しい)と!=(等しくない)演算子は、それらの低い優先順位を除いリレーショナル 演算子に類似しています。 指定された関係がtrueの場合は の場合は1、偽の場合は0となります。結果はタイプintです。 オペランドのいずれのペアについても、関係の1つが真です。論理オペランド(&&||)について

6.5.13論理AND演算子(または6.5.14論理OR演算子)

& &(又は||)演算子は、両方のオペランドが0と等しくないかどうかを比較すると1を返す。それ以外の場合は0が返されます。結果にはint型があります。 http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf

結論:

  • すべて平等と関係演算子(==!=<><=>=)リターン

あなたはここで最後のドラフトをチェックすることができます0false1true

  • 論理演算子(==||!)は、それらのオペランドに対するtrueとしてfalseおよび他の値として0を扱います。また、0false1と返します。trueです。

  • 関連する問題