不使用第三方变量交换变量遇到的思考

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

今天百度了一下

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

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

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          */

原文地址:https://www.cnblogs.com/JamesHao/p/11725067.html

时间: 2024-10-13 20:43:34

不使用第三方变量交换变量遇到的思考的相关文章

【Java】不使用第三方变量交换两个变量的值

在语言学习和进行程序设计的时候,我们交换两个变量最常使用的方法是借助temp这个新的变量进行转换,代码如下: ----------------------------------------- <--标准算法--> ----------------------------------------- int a = 3, b = 4; int temp = a; a = b; b = temp; ----------------------------------------- 这种方法易于理解

不用第三方变量交换两个变量的值

1.这需要进行位操作,必较麻烦的在学习程序语言和进行程序设计的时候,交换两个变量的值是经常要使用的.通常我们的做法是(尤其是在学习阶段):定义一个新的变量,借助它完成交换.代码如下: int a,b; a=10; b=15; int t; t=a; a=b; b=t; 这种算法易于理解,特别适合帮助初学者了解计算机程序的特点,是赋值语句的经典应用.在实际软件开发当中,此算法简单明了,不会产生歧义,便于程序员之间的交流,一般情况下碰到交换变量值的问题,都应采用此算法(以下称为标准算法). 上面的算

两个变量交换的四种方法

对于两种变量的交换,我发现四种方法,下面我用Java来演示一下. 1.利用第三个变量交换数值,简单的方法. class TestEV //创建一个类 { public static void main(String[]args) { int x =5,y=10; //定义两个变量 int temp = x; //定义第三临时变量temp并提取x值 x = y; //把y的值赋给x y = temp; //然后把临时变量temp值赋给y System.out.println("x="+x

异或巧妙实现两变量交换

今天在看C语言的位运算时,看到了如下交换a,b两值的方法: a = a^b; b = a^b; a = a^b; 后来想想,真是太神奇了!其实,我们首先知道,对于任意的x满足: x^x == 0; x^0 == x; 那么上面的式子事实上是利用了如上的规则,首先用a保存了a^b的 值,再用b = a ^ b = (a^b)^b=a^b^b=a^(b^b)=a^0=a,这样就成功的实现了b = a:接着又用a = a^b = (a^b)^b(第一个b还是原来的b,而第二个b已经是a的值,因为前面已

1108: 零起点学算法15——交换变量

1108: 零起点学算法15--交换变量 Time Limit: 1 Sec  Memory Limit: 64 MB   64bit IO Format: %lldSubmitted: 3266  Accepted: 1706[Submit][Status][Web Board] Description 水题 Input 输入2个整数(题目包含多组测试数据) Output 输出交换后的2个整数(每组测试数据一行,中间用空格隔开) Sample Input 825 23 Sample Outpu

两个变量交换的四种方法(Java)

对于两种变量的交换,我发现四种方法,下面我用Java来演示一下. 1.利用第三个变量交换数值,简单的方法. (代码演示一下) class TestEV//创建一个类{ public static void main(String[]args) { int x =5,y=10; //定义两个变量 int temp = x; //定义第三临时变量temp并提取x值 x = y; //把y的值赋给x y = temp; //然后把临时变量temp值赋给y System.out.println("x=&

变量交换x,y=y,x实现机制--元组

python中有一种赋值机制即多元赋值,采用这种方式赋值时,等号两边的对象都是元组并且元组的小括号是可选的.通常形式为 x, y, z = 1, 2, 'a string' 等同于 (x, y, z) = (1, 2, 'a string') 这种赋值类型最经常用到的环境是变量交换,形如 x, y = y, x 这种交换方式无需中间变量即可交换两个变量的值.那么具体实现机制是怎样的呢? 运行时,首先构造一个元组(y, x),然后构造另一个元组(x, y),接着用元组(y, x)赋值给(x, y)

不借助第三个变量实现两个变量交换及原理分析

通常的交换两个变量a,b的过程为 var temp; temp=a; a=b; b=temp; 需借助上面的第3个临时变量temp. 无需借助第3个临时变量交换两个变量a,b d的方法: 逻辑运算(异或) 下面的异或运算可以实现a,b的交换,而无需借助第3个临时变量: a = a ^ b; b = a ^ b; a = a ^ b; 这个交换两个变量而无需借助第3个临时变量过程,其实现主要是基于异或运算的如下性质: 1.任意一个变量X与其自身进行异或运算,结果为0,即X^X=0 2.任意一个变量

不借助第三个变量实现两个变量交换的思考

1) 算术运算简单来说,就是通过+和-运算来实现.代码如下: int a,b; a=10;b=12; a=b-a;   //a=2;b=12 b=b-a;   //a=2;b=10 a=b+a;   //a=12;b=10 通过以上运算,a和b中的值就进行了交换.表面上看起来很简单,但是不容易想到,尤其是在习惯标准算法之后. 此算法与标准算法相比,多了三个计算的过程,但是没有借助临时变量.(以下称为算术算法) 2) 指针操作对指针的操作实际上进行的是整数运算.比如:两个int指针相减得到一个整数