加法赋值+ =表达式中的行为

加法赋值+ =表达式中的行为,第1张

加法赋值+ =表达式中的行为

记住那

a += x
真的意味着
a = a + x
。要理解的关键点是 加法是从左到右求值的, 也就是说,
a
in
a +x
是在之前求值的
x

因此,让我们弄清楚是什么

b = (a += (a += a))
。首先,我们使用规则
a += x
mean
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 + 1
    2
  • b = (a = 1 + 2)
    因为
    a
    现在
    2
  • b = (a = 3)
    因为
    1 + 2
    3
  • b = 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
    现在
    4
  • b = 6

这给我们留下了

a = 4
b = 6
。可以通过打印输出
a
以及
b
使用Java / Javascript 进行验证(两者在此处具有相同的行为)。


将这些表达式视为解析树也可能会有所帮助。当我们评估时

a + (b + c)
,LHS
a
先于RHS评估
(b + c)
。这是在树结构中编码的:

   +  /  a   +    /    b   c

请注意,我们再也没有括号了- *** 作的顺序被编码到树形结构中。当我们评估树中的节点时,我们以 固定的顺序
处理该节点的子节点(即,从到左到右

+
)。例如,当我们处理根节点时
+
,我们先评估左子树
a
然后评估右子树
(b +c)
,而不管右子树是否用括号括起来(因为括号甚至不存在于解析树中)。

因此,与您可能被教过算术规则的规则相反,Java / Javascript 并不 总是首先评估“最嵌套的括号”。

请参阅Java语言规范:

15.7。评估单

Java编程语言保证运算符的 *** 作数似乎按特定的 评估顺序 (即从左到右)进行 评估

15.7.1。首先评估左手 *** 作数

在评估右侧 *** 作数的任何部分之前,似乎已对二进制运算符的左侧 *** 作数进行了完全评估。

如果该运算符是复合赋值运算符(第15.26.2节),则对左 *** 作数的求值包括记住左 *** 作数表示的变量以及获取并保存该变量的值以用于隐式二进制 *** 作。

可以在JLS的链接部分找到与您的问题类似的更多示例,例如:

示例15.7.1-1 首先评估左 *** 作数

在下面的程序中,*运算符具有一个左 *** 作数和一个右 *** 作数,左 *** 作数包含对变量的赋值,右 *** 作数包含对相同变量的引用。由引用产生的值将反映分配首先发生的事实。

class Test1 {    public static void main(String[] args) {        int i = 2;        int j = (i=3) * i;        System.out.println(j);    }}

该程序产生输出:

9

不允许评估*运算符产生6而不是9。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5431033.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-11
下一篇 2022-12-11

发表评论

登录后才能评论

评论列表(0条)

保存