2013-08-07 173 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返回。