我對下面的表達式一個簡單的問題:操作可交換不平等=在C++
int a_variable = 0;
if(0!=a_variable)
a_variable=1;
是什麼「(0 != a_variable)
」和「(a_variable != 0)
」之間的區別? 我現在沒有任何錯誤,但這是一個錯誤的方式來使用它?
我對下面的表達式一個簡單的問題:操作可交換不平等=在C++
int a_variable = 0;
if(0!=a_variable)
a_variable=1;
是什麼「(0 != a_variable)
」和「(a_variable != 0)
」之間的區別? 我現在沒有任何錯誤,但這是一個錯誤的方式來使用它?
如果您忘記了!
,第一個會給出錯誤(0 = a_variable)
,第二個會造成嚴重破壞(a_variable = 0)
。
另外,在用戶定義的運算符中,第二種形式可以用成員函數實現,而第一種形式只能是非成員函數(可能是朋友)。儘管這是一個非常糟糕的主意,但有可能以不同的方式定義這兩種形式。當然,因爲a_variable
是int
,所以在這個例子中沒有用戶定義的操作符有效。
+1擊敗我。 – 2010-07-27 19:21:53
0 != x
和x != 0
之間沒有區別。
在操作符重載的語言中,您不知道。它們的確可能會重載!=運算符來使'int&rhs'變成不同的東西......在這種情況下,它是一個int,但它絕對重要! – corsiKa 2010-07-27 19:23:53
它可能會產生的任何差異是參數的評估順序。 a != b
通常會評估a
,然後評估b
並對它們進行比較,而b != a
則會反其道而行。但是,我聽說某些地方的評估順序在某些情況下是不確定的。
它與變量或數字沒有太大的區別(除非變量是一個重載!=
運算符的類),但是當您比較某些函數調用的結果時,它可能會有所不同。
考慮
int x = 1;
int f() {
x = -1;
return x;
}
int g() {
return x;
}
假設操作數進行評估,從左至右,然後調用(f() != g())
會產生false
,因爲f()
將evalute到-1
和g()
到-1
- 而(g() != f())
會產生true
,因爲g()
將評估到1
和f()
- 到-1
。
這只是一個例子 - 最好避免在現實生活中編寫這樣的代碼!
這是一個無效的假設,C++不會對比較運算符的操作數評估順序做出承諾。 – 2010-07-28 03:11:38
是的,我指出了這一點。我只想指出,這可能是這種功能的差異。然而,據我所知,當運算符'!='在類中被重載時,則'a!= b'擴展爲'a.operator!=(b)',然後左邊的操作數必須是首先評估。或者我錯了?在'a.operator!=(b)'中調用' – kFYatek 2010-07-28 06:51:14
'時,''a'和'b'在operator operator調用之前被評估,並且不能保證'a'是否在'b'之前被評估,'' 「a」之前的「b」或每個子表達式的步驟混合在一起。 – 2010-07-29 15:16:16
挑逗,這是交換性,而不是結合性。關聯性是(a!= b)!= c'是否與'a!=(b!= c)'相同(通常不是)。 – 2010-07-27 19:22:49
其實它是對稱的。操作是可交換的(有時),關係是對稱的(有時)。 – Beta 2010-07-27 19:28:54
@貝塔:謝謝,這是我沒想到的那個詞。當然,如果我真的想要挑剔,我會問'!='是一種操作還是一種關係,但我們現在不要去那裏。 – 2010-07-27 19:38:49