2010-07-27 61 views
1

我對下面的表達式一個簡單的問題:操作可交換不平等=在C++

int a_variable = 0; 
if(0!=a_variable) 
    a_variable=1; 

是什麼「(0 != a_variable)」和「(a_variable != 0)」之間的區別? 我現在沒有任何錯誤,但這是一個錯誤的方式來使用它?

+2

挑逗,這是交換性,而不是結合性。關聯性是(a!= b)!= c'是否與'a!=(b!= c)'相同(通常不是)。 – 2010-07-27 19:22:49

+0

其實它是對稱的。操作是可交換的(有時),關係是對稱的(有時)。 – Beta 2010-07-27 19:28:54

+0

@貝塔:謝謝,這是我沒想到的那個詞。當然,如果我真的想要挑剔,我會問'!='是一種操作還是一種關係,但我們現在不要去那裏。 – 2010-07-27 19:38:49

回答

2

如果您忘記了!,第一個會給出錯誤(0 = a_variable),第二個會造成嚴重破壞(a_variable = 0)

另外,在用戶定義的運算符中,第二種形式可以用成員函數實現,而第一種形式只能是非成員函數(可能是朋友)。儘管這是一個非常糟糕的主意,但有可能以不同的方式定義這兩種形式。當然,因爲a_variableint,所以在這個例子中沒有用戶定義的操作符有效。

+0

+1擊敗我。 – 2010-07-27 19:21:53

-1

0 != xx != 0之間沒有區別。

+0

在操作符重載的語言中,您不知道。它們的確可能會重載!=運算符來使'int&rhs'變成不同的東西......在這種情況下,它是一個int,但它絕對重要! – corsiKa 2010-07-27 19:23:53

-1

它可能會產生的任何差異是參數的評估順序。 a != b通常會評估a,然後評估b並對它們進行比較,而b != a則會反其道而行。但是,我聽說某些地方的評估順序在某些情況下是不確定的。

它與變量或數字沒有太大的區別(除非變量是一個重載!=運算符的類),但是當您比較某些函數調用的結果時,它可能會有所不同。

考慮

int x = 1; 
int f() { 
    x = -1; 
    return x; 
} 
int g() { 
    return x; 
} 

假設操作數進行評估,從左至右,然後調用(f() != g())會產生false,因爲f()將evalute到-1g()-1 - 而(g() != f())會產生true,因爲g()將評估到1f() - 到-1

這只是一個例子 - 最好避免在現實生活中編寫這樣的代碼!

+0

這是一個無效的假設,C++不會對比較運算符的操作數評估順序做出承諾。 – 2010-07-28 03:11:38

+0

是的,我指出了這一點。我只想指出,這可能是這種功能的差異。然而,據我所知,當運算符'!='在類中被重載時,則'a!= b'擴展爲'a.operator!=(b)',然後左邊的操作數必須是首先評估。或者我錯了?在'a.operator!=(b)'中調用' – kFYatek 2010-07-28 06:51:14

+0

'時,''a'和'b'在operator operator調用之前被評估,並且不能保證'a'是否在'b'之前被評估,'' 「a」之前的「b」或每個子表達式的步驟混合在一起。 – 2010-07-29 15:16:16