a = b <operator> a 是不是有复合赋值运算符(其中 <operator> 不可交换)?

Posted

技术标签:

【中文标题】a = b <operator> a 是不是有复合赋值运算符(其中 <operator> 不可交换)?【英文标题】:Is there a compound assignment operator for a = b <operator> a (where <operator> is not commutative)?a = b <operator> a 是否有复合赋值运算符(其中 <operator> 不可交换)? 【发布时间】:2012-11-01 03:28:59 【问题描述】:

在很多语言中,a = a + b 可以写成 a += b 在数值运算的情况下,a + b 与 b + a 相同,因此单个复合运算符就足够了。

另外,a = a - b 可以写成 a -=b。

但是,a-b 不等于 b-a。因此,复合赋值运算符不适用于 a = b - a

那么,a = b op a 操作是否有复合赋值运算符(其中 op 可以是 +、-、*、 /、% 和顺序很重要)?

[非交换运算]

【问题讨论】:

这取决于所涉及的对象的类型。 我要求的是 + 操作不是可交换的,无论对象的类型是什么。 只需通过附加而不是前置来构建一个字符串。 除了连接之外,您要对 2 个字符串做什么? @Imno 字符串只是一个例子。 【参考方案1】:

不,a = b + a 没有简写符号。如果你需要为字符串做很多a = b + a,你最好建立一个类似的列表:

lst = []

...

lst.append("a")
lst.append("bb")
lst.append("ccc")
lst.append("dddd")

...

lst.reverse()

return ''.join(lst)   # "ddddcccbba"

【讨论】:

我并不特别关心字符串。这只是一个解释问题的例子。【参考方案2】:

不,没有。


简写的由来

我怀疑这个速记来自汇编语言,其中 ADD 指令正是这样做的 - 接受两个操作数,进行加法并将其存储到第一个操作数。

我想说人们习惯于这样思考,所以这种模式在 C 语言中也出现在 a += b 简写中。其他语言从 C 中继承了这一点。

我认为拥有或不拥有a = a + ba = b + a 没有什么特别的理由。我认为编程中更经常需要这两个。原因是历史的。这与我们使用 QWERTY 键盘布局而不是其他键盘布局的原因相同。

更新:See this,这是一个神话,因为 C 是基于 B 语言而不是来自汇编语言。来源不明。

可能的原因

每个操作员makes the language more complex。 Python 支持运算符重载,因此要创建一个新的运算符需要做更多的工作。 在与+=比较时很少使用。 人们(曾经)从汇编语言更多地使用 += 类型的操作,而不是 a = b + a,因此他们可以接受不存在速记并且没有要求的事实。 可读性问题。 缺少合适的语法。你会如何设计它?

可能的解决方案

最好的解决方案是写a = b + a,因为它第一眼就清晰易读。 出于同样的原因(可读性)(更新:who knows?)Python 不提供 C 和其他语言已知的 a++。您必须输入a += 1+= 速记对于编程初学者来说也不是很易读,但人们仍然可以以某种方式至少猜出它是怎么回事。它是传统、懒惰和可读性之间的折衷。

如果没有传统,可读性应该会胜出,至少在 Python 中是这样。因此,应该清楚地多写几个字符,而不是寻找速记。 a = b + a 就是这种情况。

注意

如果您要连接更多字符串,则应注意.join() 的性能问题。

【讨论】:

有趣(起源)。有什么东西/证据可以支持你的想法吗?我曾经认为符号只是作为一种语言特性而发展起来的,因为它易于书写。我个人认为这种表示法不应该有任何可读性问题,除非是绝对初学者。 我没有证据,但我试图用谷歌搜索一些东西,我偶然发现了这个推理:***.com/questions/3654830/… 人们提到了不必要的复杂性、可读性等。这个答案在某种程度上符合我的想法,通过深入研究C 并链接了一些来源***.com/a/3654973/325365,但这似乎只是一个神话。 谢谢,尤其是链接:)【参考方案3】:

我不知道任何语言都内置了这样的快捷方式,但某些语言允许您创建一个。

例如,在 Scala 中,您基本上可以定义自己的运算符。

【讨论】:

以上是关于a = b <operator> a 是不是有复合赋值运算符(其中 <operator> 不可交换)?的主要内容,如果未能解决你的问题,请参考以下文章

CF1110C Meaningless Operations

Python中的sorted函数以及operator.itemgetter函数

CF-1110C-Meaningless Operations

[HDU6315]Naive Operations(线段树+树状数组)

关于python中的operator.itemgetter()函数的用法

C++ std::set find 错误 operator中不能有<=