本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看 活动链接
Debug 笔记 <加法赋值+ =表达式中的行为>
提问
最近我遇到了一个问题:赋值运算符链的理解。
在回答这个问题,
我开始怀疑我自己的加法赋值运算符的行为的理解+=或任何其他operator=(&=,*=,/=等)。
我的问题是,下面的表达式中的变量何时更新到位,以使其在评估过程中更改后的值反映在表达式的其他位置,其背后的逻辑是什么?
请看以下两个表达式:
表达式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的值会在表达式的其他地方反映出来,我们何时不应该?
回答一:
记住那a += x真的意味着a = a + x。要理解的关键点是加法是从左到右求值的,
因此,让我们弄清楚是什么b = (a += (a += a))。首先,我们使用规则a += x意味着 a = a + x,然后开始以正确的顺序仔细计算表达式:
b = (a = a + (a = a + a))因为a += x意味着a = a + xb = (a = 1 + (a = a + a))因为a是当前1。我们先计算左项,a再计算右项(a = a + a)b = (a = 1 + (a = 1 + a))因为a还是1b = (a = 1 + (a = 1 + 1))因为a还是1b = (a = 1 + (a = 2))因为1 + 1是2b = (a = 1 + 2)因为a现在2b = (a = 3)因为1 + 2是3b = 3因为a现在3这使我们有了a = 3和b = 3上面所解释的。 让我们用其他表达式尝试一下b = (a += a) + (a += a):b = (a = a + a) + (a = a + a)b = (a = 1 + 1) + (a = a + a),请记住,我们先计算左项,再计算右项b = (a = 2) + (a = a + a)b = 2 + (a = a + a)而a现在是2,开始计算正确的算术b = 2 + (a = 2 + 2)b = 2 + (a = 4)b = 2 + 4和a现在为4b = 6
这给我们留下了a = 4和b = 6。可以通过打印输出a以及b使用Java / JavaScript来验证(两者在此处具有相同的行为)。
回答二:
以下是需要注意的规则
- 运算符优先级
- 变量分配
- 表达计算
表达式1
a = 1
b = (a += (a += a))
b = (1 += (a += a)) // a = 1
b = (1 += (1 += a)) // a = 1
b = (1 += (1 += 1)) // a = 1
b = (1 += (2)) // a = 2 (here assignment is -> a = 1 + 1)
b = (3) // a = 3 (here assignment is -> a = 1 + 2)
表达式2
a = 1
b = (a += a) + (a += a)
b = (1 += a) + (a += a) // a = 1
b = (1 += 1) + (a += a) // a = 1
b = (2) + (a += a) // a = 2 (here assignment is -> a = 1 + 1)
b = (2) + (2 += a) // a = 2 (here here a = 2)
b = (2) + (2 += 2) // a = 2
b = (2) + (4) // a = 4 (here assignment is -> a = 2 + 2)
b = 6 // a = 4
表达式3
a = 1
b = a += a += a += a += a
b = 1 += 1 += 1 += 1 += 1 // a = 1
b = 1 += 1 += 1 += 2 // a = 2 (here assignment is -> a = 1 + 1)
b = 1 += 1 += 3 // a = 3 (here assignment is -> a = 1 + 2)
b = 1 += 4 // a = 4 (here assignment is -> a = 1 + 3)
b = 5 // a = 5 (here assignment is -> a = 1 + 4)
文章翻译自Stack Overflow :stackoverflow.com/questions/5…