1.16 加法赋值+ =表达式中的行为 | Java Debug 笔记

204 阅读3分钟

本文正在参加「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 + x
  • b = (a = 1 + (a = a + a))因为a是当前1。我们先计算左项,a再计算右项(a = a + a)
  • b = (a = 1 + (a = 1 + a))因为a还是1
  • b = (a = 1 + (a = 1 + 1))因为a还是1
  • b = (a = 1 + (a = 2))因为1 + 12
  • b = (a = 1 + 2)因为a现在2
  • b = (a = 3)因为1 + 23
  • b = 3因为a现在3 这使我们有了a = 3b = 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 + 4a现在为4
  • b = 6

这给我们留下了a = 4b = 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…