zoukankan      html  css  js  c++  java
  • 不使用第三方变量交换变量遇到的思考

    记一次在不使用第三方变量的情况下交换变量遇到的思考

    今天百度了一下

    在不使用第三方变量的情况下交换变量的几种方法

    对其中的一种交换变量的方法特别感兴趣,看起来比较简单,但是琢磨了半天没有想明白他是按什么顺序去运行的 :

    1 public static void main(String[] args) {
    2 int a = 1000,b=2000;
    3 
    4     a= b + ( b = a ) * 0;
    5 
    6     System.out.println("a:" + a + " b:" + b);
    7 
    8 }
    结果为
     1 a:2000 b:1000 

    纠结了一晚上,不知道他的执行过程

    最后在查看反编译文件时发现很简单

     1 public static void main(String[] args) {
     2     int a = 1000;
     3     int b = 2000;
     4     //这时他不是在系统默认开辟int类型的空间,而是根据
     5     //你定义的b的大小自动为你匹配类型来开辟内存空间!
     6     short var10000 = b;           
     7     int b = a;
     8 
     9     int a = var10000 + a * 0;
    10 
    11     PrintStream var3 = System.out;
    12 
    13     a.println((String)b);
    14 
    15 }

    但(b=a)一定要放在a=b的右边

    因为程序在编译时会(b=a)前的值抽取出来放到第三方变量,然后就开始运算括号内的赋值

    如  

    1       a  =  ( b  =  a ) * 0 + b ;
    2    //a  =  ( b = 1000 ) * 0  + 1000 此时后面的b已经是1000了
    3         /*
    4            碰到括号然后碰到等号,先赋值运算
    5            此时b=a=1000
    6            然后再*0+b,返回给a
    7            结果就是a=2000,b=1000
    8           */    

    那么正常情况

     1       a  =  b + ( b  =  a ) * 0;
     2    //a  =  2000 + ( b = 1000 ) * 0; 
     3          /*
     4            编译先赋值碰到括号和=号
     5            就会先赋值完成后直接运算括号内的内容
     6            所以a=2000+(b=1000)*0;
     7            因为括号优先级运算更高
     8            所以这时b=1000已经全部赋值完了
     9            再执行括号外的表达式
    10            结果就是a=2000,b=1000
    11          */
  • 相关阅读:
    23种设计模式彩图
    Win10间歇性卡顿
    RDMA
    mii-tool与ethtool的用法详解
    linux下模拟CPU占用100%小程序
    Linux SNMP 监控一些常用OID
    SNMP协议介绍
    set排序(个人模版)
    TSP(个人模版)
    树的重心(个人模版)
  • 原文地址:https://www.cnblogs.com/JamesHao/p/11725067.html
Copyright © 2011-2022 走看看