【发布时间】:2018-11-24 22:58:57
【问题描述】:
最近遇到一个问题:Assignment operator chain understanding。
在回答这个问题时,我开始怀疑自己对加法赋值运算符 += 或任何其他 operator=(&=、*=、/= 等)的行为的理解。
我的问题是,下面表达式中的变量a是什么时候更新到原位的,使其变化的值在求值时反映到表达式中的其他地方,其背后的逻辑是什么?请看下面两个表达式:
表达式 1
a = 1
b = (a += (a += a))
//b = 3 is the result, but if a were updated in place then it should've been 4
表达式 2
a = 1
b = (a += a) + (a += a)
//b = 6 is the result, but if a is not updated in place then it should've been 4
在第一个表达式中,当计算最里面的表达式(a += a)时,它似乎没有更新a的值,因此结果是3而不是4。
但是,在第二个表达式中,a 的值被更新,因此结果为 6。
我们什么时候应该假设a的值会反映在表达式的其他地方,什么时候不应该?
【问题讨论】:
-
现在尘埃落定 - 永远不要在生产中这样做!
-
这是 Java 还是 JavaScript?
-
只是请不要像在生产环境中那样编写代码,这可能看起来很有趣,但是男孩调试会很痛苦
-
@pkpnd 一定是这样吗? Java、JavaScript 甚至 C++ 的规则并不能保证是相同的,即使人们期望它们是一样的。
-
简单地说,我的目的是让 Java/Javascript 的程序员阅读这个问题,因为这些语言中数学表达式的赋值操作没有太大区别。跨度>
标签: javascript java language-lawyer compound-assignment