栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

记住那

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。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/455507.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号