首页 新闻 会员 周边

两个数交换,但不加入第三个数

0
悬赏园豆:5 [待解决问题]

两个数交换,但不加入第三个数,对于

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);

是怎么交换的??

放飛java夢想的主页 放飛java夢想 | 初学一级 | 园豆:197
提问于:2014-07-21 22:42
< >
分享
所有回答(2)
0

num1  = num1+num2;

num2 = num1 - num2;

num1 = num1 - num2;

苏格拉底儿掉 | 园豆:216 (菜鸟二级) | 2014-07-21 23:33

我意思是想问,我写的那代码为什么可以交换!谢谢!

支持(0) 反对(0) 放飛java夢想 | 园豆:197 (初学一级) | 2014-07-21 23:50

@放飛java夢想: 你想一下加减括号和乘在在栈里边的实现顺序就懂了。num1的值在括号运算之前,它已经被它的值代替了。括号里边的赋值对num1的值没有产生影响

支持(0) 反对(0) 苏格拉底儿掉 | 园豆:216 (菜鸟二级) | 2014-07-22 00:10

@suse Liu: 为什么num1在括号里边的赋值对num1的值没影响呢?num2 = num1 +(num1 = num2)*0;这条语句的执行顺序不是:先计算括号的num1=num2再计算乘法然后是加法最后是赋值给num2吗?一开始num2把值给了num1,这样不是把前面的num1的值也改变了吗??我对栈中的实现不怎么懂(自学的)

支持(0) 反对(0) 放飛java夢想 | 园豆:197 (初学一级) | 2014-07-27 23:25
1

首先不引入第三个数的交换方法有以下几种:

第一种:如楼上介绍,也是常有的。

第二种:通过位运算符,通过左右位移,再经处理实现。

第三种:如楼上,在交换前,(num1=num2),即给num1赋值为2,(引用类型,交换地址符,寻址后num1指向数据2)。num2=num1+0;故可实现交换。

伏草惟存 | 园豆:1420 (小虾三级) | 2014-07-22 09:34

num1和num2不是都为基本数据类型吗?怎么就变成了引用类型的?可以从栈的实现顺序和我讲解一下吗?谢谢

 

支持(0) 反对(0) 放飛java夢想 | 园豆:197 (初学一级) | 2014-07-27 23:28

@放飛java夢想: 我开始看着num为string故说引用类型。其实int数据num为值类型,我做个纠正。这个程序我在vs调试结果如下:

断点调试结果如上,我又做了如下调试:

支持(0) 反对(0) 伏草惟存 | 园豆:1420 (小虾三级) | 2014-07-27 23:48

@放飛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);出栈结果即为所预期值。 

支持(0) 反对(0) 伏草惟存 | 园豆:1420 (小虾三级) | 2014-07-28 09:14

@卿君: 根据优先级先执行括号内 (num1 = num2)*0,则num2赋值给num1=2,括号内执行后的结果如上为0;num2=num1+0=1,在最后一句num2=num1+0=1,num1不是已经为2了吗??按你写的话那就是1唉!这里转得过来

支持(0) 反对(0) 放飛java夢想 | 园豆:197 (初学一级) | 2014-07-28 21:59

@放飛java夢想: 

支持(0) 反对(0) 伏草惟存 | 园豆:1420 (小虾三级) | 2014-07-29 09:53

@卿君: 这图没看懂,还是不知道为什么num2怎么就变成1了

支持(0) 反对(0) 放飛java夢想 | 园豆:197 (初学一级) | 2014-08-04 23:27
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册