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 + b
或a = 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(线段树+树状数组)