zoukankan      html  css  js  c++  java
  • java中x^=y^=x^=y交换整形数据Bug

    或许不少做过c语言或者c++的朋友都知道,如果是整形数据xy,通过x^=y^=x^=y ,就可以交换x和y的值。但是如果想在java中这么做,那就哈哈哈哈~这里写图片描述

    让我们直接看一下这么做的后果:
    这里写图片描述
    瞧见了没,y是变成1了,但是x却并不等于2,而是等于0。

    首先我们来解析一下,如果通过异或来交换两个整数,其正确流程如下:

    x = x ^ y;
    y = y ^ x;
    x = y ^ x;

    然而在java中上述表达式实际运行情况又是怎样呢?

            int tmp1 = x;
            int tmp2 = y;
            int tmp3 = x ^ y;
            x = tmp3;
            y = tmp2 ^ tmp3;
            x = tmp1 ^ y;

    这是因为在java中,操作符的操作数是从左向右求值的,比如计算x^=expr的值时,在计算expr前先提取x的值,然后将异或的结果赋值给x。因此在上面的式子中,x实际上被提取了两次,但是两次提取都发生在所有的赋值以前,也就是两次提取前,其值是一样的,而这就是错误的源泉。

    上面的是不是看的很懵,没关系,看一下改正后的代码,再结合上面的解释就很好理解了,

    y=(x^=(y^=x))^y;

    运行截图如下:
    这里写图片描述

    这里写图片描述

    ——参考资料《Java解惑》

  • 相关阅读:
    VMware80端口映射
    固态硬盘安装win7系统问题。
    正向代理服务器,反向代理服务器
    Oray.com花生壳路由器配置注意
    Nginx命令
    Nginx反向代理图片总结
    C#获取视频文件播放长度
    汉语拼音的发展
    MVC 公共类App_Code不识别
    记录一下学习Android的小知识
  • 原文地址:https://www.cnblogs.com/yinyoupoet/p/13287513.html
Copyright © 2011-2022 走看看