?
? ????? PHP ??? ???? ??? ?? ??
比較運(yùn)算符是測試條件的二元運(yùn)算符,如果該條件為邏輯真,則返回1,如果該條件為假,則返回0。
Operator | Operator name | Example | Description |
---|---|---|---|
== | equal to | a == b | a is equal to b |
!= | not equal to | a != b | a is not equal to b |
< | less than | a < b | a is less than b |
greater than | a > b | a is greater than b | |
<= | less than or equal to | a <= b | a is less than or equal to b |
| greater than or equal to | a >= b | a is greater than or equal to b |
關(guān)系運(yùn)算符表達(dá)式具有這種形式。
lhs < rhs | (1) | |
---|---|---|
lhs > rhs | (2) | |
lhs <= rhs | (3) | |
lhs >= rhs | (4) |
1)少于表達(dá)式
2)大于表達(dá)式
3)較少或相等的表達(dá)
4)更大或相等的表達(dá)
其中
lhs, rhs | - | expressions that both have real type or both have pointer to object type |
---|
任何關(guān)系運(yùn)算符表達(dá)式的類型是int
,并且其值(不是左值)是1
指定的關(guān)系成立并且0
指定的關(guān)系不成立時的值。
如果 lhs 和 rhs 是任何實際類型的表達(dá)式,那么。
如果 lhs 和 rhs 具有算術(shù)類型,則執(zhí)行通常的算術(shù)轉(zhuǎn)換
轉(zhuǎn)換后操作數(shù)的值以通常的數(shù)學(xué)意義進(jìn)行比較(除了正數(shù)和負(fù)數(shù)比較相等且任何涉及 NaN 值的比較返回零)
請注意,復(fù)數(shù)和虛數(shù)不能與這些運(yùn)算符進(jìn)行比較。
如果lhs和rhs是指針類型的表達(dá)式,它們必須都是指向兼容類型對象的指針,只是指向?qū)ο蟮南薅ū缓雎浴?/p>
指向不是數(shù)組元素的對象的指針被視為指向具有一個元素的數(shù)組元素
如果兩個指針指向同一個對象,或者兩個指針都指向同一個數(shù)組的末尾,則它們會相等
如果兩個指針指向相同數(shù)組的不同元素,則指向索引較大的元素的指針比較大。
如果一個指針指向一個數(shù)組的元素,另一個指針指向一個超過同一個數(shù)組的末尾,那么一個過去的末尾指針會比較大
如果兩個指針指向同一個結(jié)構(gòu)體的成員,那么稍后在結(jié)構(gòu)體定義中聲明的成員指針比先前聲明的成員的指針大。
指向同一工會成員的指針相等
所有其他指針比較都會調(diào)用未定義的行為
#include <assert.h>int main(void){ assert(1 < 2); assert(2+2 <= 4.0); // int converts to double, two 4.0's compare equal struct { int x,y; } s; assert(&s.x < &s.y); // struct members compare in order of declaration double d = 0.0/0.0; // NaN assert( !(d < d) ); assert( !(d > d) ); assert( !(d >= d) ); assert( !(d >= d) ); float f = 0.1; // f = 0.100000001490116119384765625 double g = 0.1; // g = 0.1000000000000000055511151231257827021181583404541015625 assert(f > g); // different values}
等號運(yùn)算符表達(dá)式具有這種形式。
lhs == rhs | (1) | |
---|---|---|
lhs != rhs | (2) |
1)等于表達(dá)
2)不等于表達(dá)
其中
lhs,rhs | - | 具有任何算術(shù)類型(包括復(fù)數(shù)和虛數(shù))的表達(dá)式都是指向?qū)ο蠡蚣嫒蓊愋秃瘮?shù)的指針,忽略指向類型的限定符一個是指向?qū)ο蟮闹羔?,另一個是指向(可能限定的)void一個是指向?qū)ο蠡蚝瘮?shù)的指針,另一個是空指針常量,例如NULL |
---|
兩者都有算術(shù)類型(包括復(fù)數(shù)和虛數(shù))
都是指向兼容類型的對象或函數(shù)的指針,而忽略指向類型的限定符
一個是指向?qū)ο蟮闹羔?,另一個指向(可能合格的) void
一個是指向?qū)ο蠡蚝瘮?shù)的指針,另一個是空指針常量,如 NULL
任何等號運(yùn)算符表達(dá)式的類型是int
,并且其值(不是左值)是1
指定的關(guān)系成立并且0
指定的關(guān)系不成立時的值。
如果兩個操作數(shù)都具有算術(shù)類型,則執(zhí)行通常的算術(shù)轉(zhuǎn)換,并以通常的數(shù)學(xué)意義對結(jié)果值進(jìn)行比較(除了正數(shù)和負(fù)數(shù)比較相等并且任何涉及NaN值的比較,包括與其自身的相等性返回零)。特別是,如果復(fù)數(shù)類型的實部比較相等并且它們的虛部比較相等,則復(fù)數(shù)類型的值是相等的。
如果一個操作數(shù)是一個指針而另一個是空指針常量,則空指針常量首先被轉(zhuǎn)換為指針的類型(它給出一個空指針值),并且如下所述比較這兩個指針
如果一個操作數(shù)是一個指針,而另一個是指向 void 的指針,則非 void 指針轉(zhuǎn)換為指向 void 的指針,并如下所述比較兩個指針
如果滿足以下任一條件,則兩個指針相等:
它們都是它們類型的空指針值
它們都是指向同一個對象的指針
一個指針指向一個 struct / union / array 對象,另一個指向其第一個成員/任何成員/第一個元素
他們都指向一個過去的同一陣列的最后一個元素
一個是一個超過數(shù)組的末尾,另一個是不同數(shù)組的起始位置(相同類型),它跟隨在較大數(shù)組中的第一個數(shù)組中,或者在沒有填充的結(jié)構(gòu)中
(與關(guān)系運(yùn)算符一樣,指向不是任何數(shù)組元素的對象的指針的行為就像指向大小為1的數(shù)組的元素的指針)。
結(jié)構(gòu)類型的對象不會自動比較相等,并且比較它們memcmp
是不可靠的,因為填充字節(jié)可能有任何值。
由于指針比較與無效指針一起工作,因此NULL
可以將宏定義為(void*)0
C 語言,盡管在 C ++中無效指針不會隱式轉(zhuǎn)換為類型指針。
在比較浮點(diǎn)值是否相等時必須小心,因為許多操作的結(jié)果不能精確表示,必須舍入。在實踐中,通常會比較浮點(diǎn)數(shù),以考慮最后一個地方的一個或多個單位的差異。
#include <assert.h>int main(void){ assert(2+2 == 4.0); // int converts to double, two 4.0's compare equal int n[2][3] = {1,2,3,4,5,6}; int* p1 = &n[0][2]; // last element in the first row int* p2 = &n[1][0]; // start of second row assert(p1+1 == p2); // compare equal double d = 0.0/0.0; // NaN assert( d != d ); // NaN does not equal itself float f = 0.1; // f = 0.100000001490116119384765625 double g = 0.1; // g = 0.1000000000000000055511151231257827021181583404541015625 assert(f != g); // different values}
C11 standard (ISO/IEC 9899:2011):
6.5.8 Relational operators (p: 95-96)
6.5.9 Equality operators (p: 96-97)
C99 standard (ISO/IEC 9899:1999):
6.5.8 Relational operators (p: 85-86)
6.5.9 Equality operators (p: 86-87)
C89/C90 standard (ISO/IEC 9899:1990):
3.3.8 Relational operators
3.3.9 Equality operators