2012-04-14 64 views
2

在C++中,可以爲用戶類型重載==!=運算符,但語言並不在乎您是如何執行的。可以重載都返回true不管是什麼,所以!(a==b)(a!=b)不一定必須評估,以同樣的事情。有多少其他語言可以有¬(a = b)(a ≠ b)不同的情況?這是常見的事情嗎?¬(a = b)和(a≠b)的語言可以不同

這不僅僅是過載的問題,但奇怪的角落情況下,甚至基本類型。 C和C++中的NaN並不等於任何東西,包括NaN。在C中,NaN!= NaN的確如此,但在其他語言中可能會出現類似的情況,導致¬(a = b)(a ≠ b)不同?

+2

僅僅因爲你可以做到這一點在C++並不意味着你永遠,永遠應該...... – corsiKa 2012-04-14 19:34:00

+0

我知道你可以在Ruby中做到這一點! – Arth 2012-04-14 19:34:19

+3

我也會試圖添加..任何語言,您可以重載==或!=運算符。或者這太obv? – Arth 2012-04-14 19:35:42

回答

1

我知道一個事實,Python和Ruby可以和Java和PHP不能。 (在Java ==確定兩個對象在內存中的同樣的事情,不只是語義上等效值。在PHP中......沒關係。)我還想象,Lisp和JS可以和C不能,但這是多一點投機。

沒什麼不同尋常的,以便能夠重載運算符。儘管如此,!(a==b)(a!=b)的結果很不一樣。

+0

Java只允許改變正值:'等於'並且無法超載否定形式。 – 2012-04-14 19:49:26

+0

是的,你可以合理地重寫== ==和'!='來產生除布爾結果之外的其他東西(可能是SQL條件或者其他東西),但是破壞邏輯是適得其反的,所以'!(a == b) '不等於'(a!= b)'。 – 9000 2012-04-14 20:48:19

2

Guy L. Steele說過一句名言

...定義自己的操作功能的能力意味着一個簡單的語句,如X = A + B;在內部循環中可能涉及向阿富汗發送電子郵件。

正如corsiKa所說,只因爲你可以做到這一點,並不是一個好主意。

相關問題