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

为什么是“ a ^ = b ^ = a ^ = b;” 与“ a ^ = b”不同;b ^ = a; a ^ = b;”?

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

为什么是“ a ^ = b ^ = a ^ = b;” 与“ a ^ = b”不同;b ^ = a; a ^ = b;”?

问题是评估的顺序:

参见JLS第15.26.2节

首先,对左操作数求值以产生一个变量。 如果该评估突然完成,则赋值表达式由于相同的原因而突然完成;右边的操作数不会被评估,并且不会发生赋值。

否则,将保存左侧操作数的值,然后评估右侧操作数。如果该评估突然完成,则赋值表达式由于相同的原因突然完成,并且不会发生赋值。

否则,将左侧变量的保存值和右侧操作数的值用于执行复合赋值运算符指示的二进制运算。如果该操作突然完成,则赋值表达式由于相同的原因而突然完成,并且不会发生赋值。

否则,将二进制运算的结果转换为左侧变量的类型,进行值集转换(第5.1.13节)为适当的标准值集(而不是扩展指数值集),然后将结果转换的结果存储到变量中。

所以你的表情是:

a^=b^=a^=b;

  1. 评估
    a
  2. 评估
    b^=a^=b
  3. 将两者进行异或运算(因此
    a
    第一步中的尚未
    ^=b
    应用)
  4. 将结果存储在
    a

换句话说,您的表达式等效于以下Java代码:

    int a1 = a;    int b2 = b;    int a3 = a;    a = a3 ^ b;    b = b2 ^ a;    a = a1 ^ b;

您可以从方法的反汇编版本中看到这一点:

  private static void swapDemo1(int, int);    Code:       0: iload_0   1: iload_1   2: iload_0   3: iload_1   4: ixor      5: dup       6: istore_0  7: ixor      8: dup       9: istore_1 10: ixor     11: istore_0


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

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

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