两个数交换,但不加入第三个数,对于
int num1 =1;
int num2 =2;
System.out.println("交换前---num1="+num1+" num2="+num2);
num2 = num1 +(num1 = num2)*0;
System.out.println("交换后---num1="+num1+" num2="+num2);
是怎么交换的??
num1 = num1+num2;
num2 = num1 - num2;
num1 = num1 - num2;
我意思是想问,我写的那代码为什么可以交换!谢谢!
@放飛java夢想: 你想一下加减括号和乘在在栈里边的实现顺序就懂了。num1的值在括号运算之前,它已经被它的值代替了。括号里边的赋值对num1的值没有产生影响
@suse Liu: 为什么num1在括号里边的赋值对num1的值没影响呢?num2 = num1 +(num1 = num2)*0;这条语句的执行顺序不是:先计算括号的num1=num2再计算乘法然后是加法最后是赋值给num2吗?一开始num2把值给了num1,这样不是把前面的num1的值也改变了吗??我对栈中的实现不怎么懂(自学的)
首先不引入第三个数的交换方法有以下几种:
第一种:如楼上介绍,也是常有的。
第二种:通过位运算符,通过左右位移,再经处理实现。
第三种:如楼上,在交换前,(num1=num2),即给num1赋值为2,(引用类型,交换地址符,寻址后num1指向数据2)。num2=num1+0;故可实现交换。
num1和num2不是都为基本数据类型吗?怎么就变成了引用类型的?可以从栈的实现顺序和我讲解一下吗?谢谢
@放飛java夢想: 我开始看着num为string故说引用类型。其实int数据num为值类型,我做个纠正。这个程序我在vs调试结果如下:
断点调试结果如上,我又做了如下调试:
@放飛java夢想: @卿君: 整个执行入栈过程如下:运行到num1 =1,则1入栈,执行num2 =2;则2入栈。执行下面语句System.out.println("交换前---num1="+num1+" num2="+num2);根据先进后出原则数据出栈。当执行num2 = num1 +(num1 = num2)*0 时,根据优先级先执行括号内 (num1 = num2)*0,则num2赋值给num1=2,括号内执行后的结果如上为0;num2=num1+0=1;执行下句System.out.println("交换后---num1="+num1+" num2="+num2);出栈结果即为所预期值。
@卿君: 根据优先级先执行括号内 (num1 = num2)*0,则num2赋值给num1=2,括号内执行后的结果如上为0;num2=num1+0=1,在最后一句num2=num1+0=1,num1不是已经为2了吗??按你写的话那就是1唉!这里转得过来
@放飛java夢想:
@卿君: 这图没看懂,还是不知道为什么num2怎么就变成1了