为什么大多数编程语言都没有“!>”(不大于)和“!<”(不小于)运算符?


28

我想知道是否有任何原因-或者仅仅是历史的偶然- 大多数编程语言中都没有!>!<运算符?

a >= b (大于或等于b)可以写成!(a < b) (a不小于b)等于a !< b

当我编码自己的表达式树生成器时,这个问题使我震惊。大多数编程语言都有的a != b运算符!(a=b),那么为什么不!>!<

更新:

  • !<(不少于)比(大于或等于)更容易发音>=
  • !<(不少于)的类型>=(大于或等于)的类型短
  • !<(不少于)比(大于或等于)更容易理解*>=

*因为OR是二进制运算符,所以您的大脑需要操作两个操作数(grater,等于),而因为NOT是一元运算符,并且您的大脑仅需要操作一个操作数(较小)。


3
并不一定更容易在各种语言发音。例如,在德语中,我们说“größer/ gleich”,但我从未听过“ nicht kleiner”。
Ingo 2012年

1
更容易理解的说法是站不住脚的任一。在任何一种情况下,您都必须操作2个操作数,因为对于关系运算符,这是正常的。此外,您仅假设大脑可以在1个操作数而不是2个操作数上更容易操作。您是否从神经科学领域获得任何证据?
Ingo 2012年

Answers:


84

d编程语言DMC的扩展到C和C ++那样支持这些运营商(其中所有14个组合),但有趣的是,d 是要贬低这些运营商,主要是因为

  1. 到底是a !< b什么?是的a>=b || isNaN(a) || isNaN(b)!<一样的>=,因为NaN !< NaN是真实的,同时NaN >= NaN是假的。IEEE 754 很难掌握,因此使用a !< b只会引起NaN处理方面的混乱-您可以在Phobos(D的标准库)中搜索此类运算符,并且有很多用法旁边都有注释,以提醒读​​者涉及NaN,
  2. 因此,即使像D中这样的运算符存在,也很少有人会使用它,
  3. 并且必须为这些很少使用的运算符定义8个以上的令牌,这使编译器变得无济于事,
  4. 如果没有这些运算符,则仍然可以使用等价的运算符,!(a < b)或者,如果希望将其明确表示为,则a >= b || isNaN(a) || isNaN(b)它们更易于阅读。

此外,与!=(≠)或>=(≥)不同,在基本数学中很少看到(≮,≯,basic,≱)关系,因此对于很多人来说很难理解。

这可能也是大多数语言不支持它们的原因。


seldomly seen in basic math-更像是从未见过。我们在代数中学习,只是将其翻转为数学上等效的代数(特别是因为NaN它没有出现在基础数学中)
Izkata 2012年

我们真正需要的是恕我直言声明变量,它们的行为作为一种手段double ,除了为自己NaN的行为。在许多情况下,可能执行任何类型的比较的代码NaN都希望NaN比较的内容大于所有内容,或者使比较的内容小于所有内容,或者在比较尝试中引发异常。允许代码声明性地指定NaN应如何考虑将减少使用命令式代码实现正确行为的需要。
supercat

@supercat:您可以使用<fenv.h>类似的函数使NaN操作抛出异常fesetexceptflag
kennytm 2014年

@KennyTM:必须先执行操作才能设置标志,之后又需要取消设置,这似乎很棘手,也很容易出错,并且无法解决要强加全部命令的可能性。据我所知,IEEE刚刚引入了一些新的比较方法,该方法会强加总订单,如果逾期变更,我认为这是受欢迎的。看看语言如何反应会很有趣。
2014年

47

因为让两个不同的运算符具有完全相同的含义没有多大意义。

  • “不大于”(!>)与“小于或等于”(<=)完全相同
  • “不小于”(!<)与“大于或等于”(>=)完全相同

这不适用于“不等于”(!=),没有相同含义的运算符。

因此,您所做的修改将使语言更加复杂,没有任何好处。


5
怎么样x = x + 1x += 1x++

33
@dunsmoreb:这些都不是同一件事。只有一个用于“增量”的目的。您已经充分利用了其他两个表达式来达到相同的目的这一事实是无关紧要的,因为它们两个都更为通用。
DeadMG

1
<>是与含义相同的运算符!=,而Python 2两者都有。
krlmlr 2012年

9
@ user946850以及具有现在被广泛认为是一个错误,使用<>已被废弃了很久,自3.0它删除(提个醒,最后2.X版本不断,2.7,是在2010年夏天发布)。

3
@svick使++运算符更加出色,它将阻止那些C#程序员来到这里,对程序行为进行合理假设,然后窃取我的C ++程序员工作!

10

!<是的同义词>=。以后只是键入定义良好的数学符号的一种方法。没错,口语中使用的“不少于”是正确的,但是它是口语化的,可能会模棱两可(可以解释为或误解为>)。另一方面,编程和数学使用明确定义的明确术语。

即使在3值的逻辑,如ANSI SQL,not x < y是等效的x >= y,因为它们都给予NULL如果任一xyNULL。但是,存在不符合ANSI标准的SQL方言,它们并不等效,而它们却具有!<


10
但是,使用浮点数时,它们通常不相等。例如,与进行任何比较NaN都是错误的,因此!(2 < NaN) == true,而(2 >= NaN) == false
hammar 2012年

@hammar:是的,但是关于s的所有算术关系都是如此NaN。他们全部停止正常行为。
Nicol Bolas'2

@hammar-这是浮点错误,可以这么说,它只是没有正确实现Ord。但是,这并不是一个大问题,因为没有人强迫我们执行a !< b = not (a < b),我们只能说(!<)=(> =)。
Ingo 2012年

8

Transact-SQL具有!>(不大于)!<(不小于)运算符。

因此,除您之外,Sybase Microsoft的某人也认为这将是一个好主意。就像微软的鲍勃一样!:)


在v 2005中没有添加吗?
JeffO

5
这个世界上有很多疯狂的不明智的人,并不是只有彼此同意,才是正确的。

@JeffO然后我们应该责怪微软,而不是Sybase?
yannis 2012年

有趣。我很好奇这背后的故事。
surfasb 2012年

@surfasb是的,我也是。我的猜测是它只是语法糖,对此没什么特别的。
yannis 2012年

4

我认为答案很简单,即不需要!<操作员。正如您在问题中指出的那样,已经>=并且<=有可能否定现有表达式,那么为什么还要添加另一个运算符?


我同意添加执行相同操作的运算符没有意义,但是为什么“他们”选择> =而不是!<,发音NOT NOT LESSER则容易得多,然后发音GREATER OR EQUALS则更容易键入,对于脑子懂了。
Alex Burtsev '02

!<的类型比短>=,或者我缺少什么吗?
布莱恩·奥克利

我的意思是它是文本表示形式(发音为文本)。
Alex Burtsev '02

4

RFC 1925

达到完美不是在没有什么可以补充的时候,而是在没有什么可以补充的时候。

添加其他可重复现有功能的运算符除了增加(不必要的)语言复杂性(并因此增加分词器和解析器)外,无济于事。

还考虑在可能出现运算符重载的语言中,您将需要另一个运算符重载。考虑什么时候会混淆bool operator<=bool operator!>可能返回不同的结果(是的,我知道人们已经可以进行不一致的比较了)。

最后,考虑一下其中方法或运算符被多次定义的语言(Ruby-我在看),您有一个使用<=的程序员,而另一个使用!>的程序员,并且对于同一表达式您有多种代码风格。


是! 这是科学简约的原则。
luser droog 2012年

3

!<等于> =现在我们为什么不先拥有第二个语言呢,因为所有语言都先执行正运算符,然后再处理负运算符,所以实现> =还可以覆盖!<和<=覆盖!>。并认为它们将是多余的,并跳过它们。

总是先尝试实施积极案例,然后再去消极案例(:)积极思考,仅针对我个人观点)


2

原因是编程语言中的运算符是从数学传统中借用的,而在数学中,没有人真正使用“不大于”和“不小于”,因为“较小或相等”和“较大或相等”的作用一样好。

因此,在编程语言中,我们通常会得到一个像≠的符号,表示不等于(!=/=,除非有人喜欢<>或文本运算符)

和看起来像≤和≥(<=>=)的东西


顺便说一句,我不同意您的断言,即“不”更容易理解,并因此得出“或”的理由。在数学中,如果有更直接的替代方法可用,则涉及很多否定(如简化为荒谬)的证明通常会被反对。同样,在排序的情况下,我们拥有的(并且在思考或证明某些东西时使用的)基本知识是<,=和>之间的三角分割,因此,如果您想执行任何!<语句,则可能必须将其转换为> =任何有用的东西。


2

我会部分归咎于汇编指令集。您将获得诸如jge“如果大于或等于则跳转”之类的说明。而不是“跳不少于”。

编译器编写者可能会偏离汇编编写者的想法,这大概是基于在芯片上进行设​​计时如何对其进行标记的。

...可能


1

我想几年前我看到了一些语言,其中使用!=了类似的语言代替了运算符(不等于)<>。虽然记不得他们的名字了...

我认为这比阅读!(a < b)或阅读a !< b都难a >= b。可能这就是为什么!<不使用它的原因(我认为它的确看起来很丑)。


1
<>(是?)主要用于BASIC方言,SQL和Pascal方言。
yannis 2012年

@Yannis Rizos感谢您的提醒。他们在高中时教我们Pascal,这就是我所看到的:)。
Radu Murzea

2
Python 2里也有<>,但它是在3去除
丹尼尔Lubarov

从逻辑的角度来看,!=它比通用<>,因为您可以拥有定义了相等但实际上没有有用排序的事物(例如复数)。
David Thornley,2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.