我正在教一个关于编程的朋友,我很难说服他们a = b
和b = a
是两个非常不同的东西。
我最终找到了正确的词来形容它(right associative)让我思考。
是否存在任何左对联的编程语言?我从未见过以下语言:
a = b
导致b被设置为a的值。
答案 0 :(得分:4)
你误解了联想。如果op
等同于(a op b) op c
,则运算符a op (b op c)
是关联的。对于不关联的运算符,因此a op b op c
代表前者或后者是否相关。因此,我们区分左关联运算符,它是(a op b) op c
和右关联运算符,它是a op (b op c)
。
大多数语言中的大多数运算符都是左关联的。以-
为例:a - b - c
在大多数语言中等同于(a - b) - c
,而不是a - (b - c)
。
赋值运算符是一个例外,因为(a = b) = c
通常不合法(因为您无法分配给赋值的结果)。因此,在大多数语言中,a = b = c
相当于a = (b = c)
。一个值得注意的例外是Python,其中a = b = c
根本不关联,而且完全是非法的。
这些与a = b
和b = a
之间的差异无关。由于这只涉及=
运算符的单次使用,因此关联性根本不会考虑到这一点。相反,相关属性为commutativity:如果op
等同于a op b
,则运算符b op a
是可交换的。我不知道任何语言中的任务是可交换的,我也不知道它是如何形成的。
左派交换或右交换等概念不存在。据我所知,对于“a = b
将b
分配给a
还是反之亦然”这一问题没有任何术语? - 这只是赋值运算符语义的一部分。
答案 1 :(得分:2)
我不相信。虽然你总是可以重载赋值运算符并导致c ++中的完全混淆。
答案 2 :(得分:1)
R定义了<-
和->
赋值运算符。
> b <- 42
> b -> a
> a
[1] 42
答案 3 :(得分:0)
如果我们谈论Operator associativity
,我们应该考虑两种类型associativity
:side_associative
(例如=
)或non-associative
(例如==
如果机器从左到右或从右到左得到线条,它就不会对机器产生任何影响。
最初left associative
没有这样的编程语言,但有些编程语言通过运算符重载允许它,而有些(例如R
)允许:->
和{{1} }。
我相信在欧洲没有人会喜欢它,但在中东可能会觉得它很可爱。我可以想象有<-
s在左侧切换到右侧,但最后编译器是以欧洲方式编写的。