对链式比较运算符 (x < y < z) 的语言支持

Posted

技术标签:

【中文标题】对链式比较运算符 (x < y < z) 的语言支持【英文标题】:Language support for chained comparison operators (x < y < z) 【发布时间】:2011-05-04 16:48:37 【问题描述】:

question 发布了关于链式比较运算符以及它们在不同语言中的解释方式。

链接比较运算符意味着(x &lt; y &lt; z) 将被解释为((x &lt; y) &amp;&amp; (y &lt; z)) 而不是((x &lt; y) &lt; z)

关于该问题的 cmets 表明 Python、Perl 6 和 Mathematica 支持链接比较运算符,但还有哪些其他语言支持此功能,为什么它不更常见?

快速浏览一下 Python 文档就会发现,这个功能至少从 1996 年就已经存在。是否有更多的语言没有添加这种语法的原因?

静态类型的语言在类型转换方面会出现问题,但还有其他原因导致这种情况不常见吗?

【问题讨论】:

好问题。在我看来,它甚至至少可以向后兼容 Java。 (因为 &lt;&gt; 没有为布尔值定义。) 我认为这并不常见,因为程序员太习惯 &lt; 作为二元运算符了。 为什么静态类型的语言会有这个问题?你的意思是什么类型转换? 不,您不需要动态输入。首先,静态类型不会阻止布尔运算符。其次,即使这样做,此功能也不需要布尔值上的&lt;&gt;,它需要编译器将x &gt; y &lt; z 重写为x &gt; y and y &lt; z。您无法通过在布尔值上定义 &lt;&gt; 来解决此问题 - 但由于无论如何都没有定义这些(这将是荒谬的),因此可以将此功能添加到例如Java 不会破坏尝试排序布尔值的现有代码。 是的,抱歉,我错误地组合了这些问题。它仍然让我想知道为什么这不是更常见的语法。 【参考方案1】:

自 1960 年代后期以来,链式比较是 BCPL 的一项功能。

【讨论】:

【参考方案2】:

它应该更常见,但我怀疑这不是因为它使解析语言更复杂。

好处:

坚持最小意外原则 读起来像教数学 减少认知负荷(参见前面的 2 点)

缺点:

该语言的语法更复杂 特殊情况句法糖

至于为什么不,我的猜测是:

语言作者没有想到 在“值得拥有”列表中 已确定它不足以证明实施的合理性

【讨论】:

如何“教授数学”并不一定有好处。数学思想是如何教授的,甚至是如何写下来的,通常都不能反映正确的基本思想。现在,外行人尝试编程更为常见,但真正深入的编程最终需要更好地理解函数符号和概念(例如 lambda 表达式)。 “x 不同意“坚持最小意外原则”:首先吸引我到 C 语言的一件事是,无论上下文如何,每个表达式都有相同的含义。无论上下文如何,a &lt; b 始终会生成 10。没有惊喜。 a &lt; b 有时是二元 &lt; 运算符,有时是由 &lt; 符号和后来的 &lt; (或 &gt; 等)组成的三元运算符的一部分,会增加认知负荷【参考方案3】:

Scheme(可能还有大多数其他 Lisp 家族语言)在其语法中有效地支持多重比较:

(< x y z)

这可以被认为是具有三个参数的&lt; 函数的普通函数应用程序。请参阅规范中的6.2.5 Numerical Operations。

Clojure 也支持chained comparison。

【讨论】:

【参考方案4】:

我认为 ICON 是具有此功能的原始语言,而在 ICON 中,它不适合将布尔值作为特殊的“失败”标签处理,而所有其他值都被视为 true。

【讨论】:

【参考方案5】:

好处太小,不足以证明语言复杂化。

你并不经常需要它,多几个字符很容易干净利落地得到同样的效果。

【讨论】:

增加复杂性似乎是一个糟糕的理由。我想不出当前功能在动态类型语言中有用的原因,而这会添加额外的功能而不会产生太大的冲突。在我看来,它也更容易阅读。 我倾向于同意。它的简洁性是百万分之一,但实施并融入语法确实需要很多麻烦。 @Alan 你不能这么想。相反,您必须扭转局面,与规范、记录、计划、实施和测试所需的工作相比,您能获得什么? @Alan:至于对复杂性的投票:还有哪些其他功能会“期望”拥有该功能(例如自定义重载运算符),让它们明确地工作有多复杂?它是否会引入潜在的解析歧义(ala C++ 的std::list&lt;std::list&lt;int&gt;&gt; 问题)?您是否希望它短路评估(foo(value) &lt; b &lt; bar(value) - 如果foo(value) &lt; b 为假,是否会调用 bar?),为什么或为什么不呢?需要进行大量的调查以支持任何新的语言功能,尤其是那些在流行语言中不常见的功能。 当前流行的语言都有从 C 继承的垃圾语法。有/有很多语言支持链式比较,因此无需重新发明***。

以上是关于对链式比较运算符 (x < y < z) 的语言支持的主要内容,如果未能解决你的问题,请参考以下文章

运算符

php三目运算计算三个数最大值最小值

Comparisons

X 和 Y 或 Z - 三元运算符

java语言中,是++优先还是*优先?计算的优先顺序是?例:z=y*x++,其中x=5,y=9,答案是?还有,++x和x++

比较运算符