2012-04-14 38 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所说,只因为你可以做到这一点,并不是一个好主意。

相关问题