黑马程序员技术交流社区
标题:
值传递和址传递 抛砖引玉下
[打印本页]
作者:
贺靖轩
时间:
2013-4-1 08:25
标题:
值传递和址传递 抛砖引玉下
咋是爽快人,废话不多说。
代码:
public static void main(String[] args)
{
int x=3,y=4;
change(x,y);
System.out.println(x);
System.out.println(y);
}
public static void change(int x,int y)
{
x^=y;
y^=x;
x^=y;
System.out.println(x);
System.out.println(y);
}
输出:
4
3
3
4
求实现功能的方法和解释。
作者:
刘胜寒
时间:
2013-4-1 08:54
好吧。。。我给你解释一下吧...
int x = 3 , y = 3 是在main栈区里面存储的。
change(x,y); 这个函数里面的x,y是存在change栈区里面。mian方法中的变量作为参数值传入change方法区的。无论change中的x,y怎么改变,对main()里面的x,y没有任何影响。
有个很好的例子:
孙悟空可以复制很多的孙悟空,这些孙悟空可以杀妖降魔,被杀,但这些被复制的孙悟空,和真正的孙悟空本身没有任何影响。java疯狂讲义,讲的很详细。
还有一中方法可以通过change改变main里面的x,y值。不说了
作者:
chensc
时间:
2013-4-1 08:57
自己学习了!
作者:
贺靖轩
时间:
2013-4-1 09:00
似水像火 发表于 2013-4-1 08:54
好吧。。。我给你解释一下吧...
int x = 3 , y = 3 是在main栈区里面存储的。
change(x,y); 这个函数里面 ...
恩 你说的我大概懂 关键我是不知道CHANG方法该如何实现
作者:
谢达
时间:
2013-4-1 09:00
public static void main(String[] args)
{
int x=3,y=4;
change1(new Integer(x),new Integer(y));
//因为change(x,y)是值传递,相当于在在change方法里面进行了修改,只局部有效,退出方法
//后本身并没有变化
System.out.println(x);
System.out.println(y);
}
public static void change(int x,int y)
{
//此处是采用异或(将两个数的二进制形式每位异或,相异为1,相同为0) 方式交换数据,效率比较高的一种
// x= 3 ---> 0011 x=4 --->0100
x^=y; // 0011^0100 ---> x=0111 y=0100
y^=x; // 0111^0100 ---> y=0011 x=0111
x^=y; // 0011^0111 ---> x=0100
//x= 0100 4
//y= 0011 3
System.out.println(x); //4
System.out.println(y); //3
}
Java传值与传引用的区别可以去看下
http://developer.51cto.com/art/201104/254715.htm
作者:
郝勇
时间:
2013-4-1 09:02
输出:
4
3
是因为在你的主函数main中的第二行change(x,y); 调用了互换位置的那个构造方法 你那个方法里有输出语句,所以先会输出 4 3 也就是两个数调换后的结果
3
4
这里是因为你的主函数里也有输出语句,就将主函数里的两个变量给输出了
x^=y;
y^=x;
x^=y;
System.out.println(x);
System.out.println(y);
上面的交换位置用到了这么一个知识:一个数异或同一个数两次 值不变!
x^=y; 也就是x=x^y;
y^=x; 也就是y=y^x; 因为x=x^y; 将x=x^y带入y=y^x得到y=y^(x^y) 这里x和y异或了两次 结果还是x y=x 位置互换
同理
x^=y; 也就是x=x^y;因为y=y^x; 将y=y^x带入x=x^y得到x=x^(y^x) 这里y和x异或了两次 结果还是y x=y 位置互换
上面写的比较啰嗦 简单起来就是:
x^=y;
y^=x; --->y=y^x---> y=y^(x^y) --->y=x
x^=y; --->y=y^x---> x=x^(y^x) --->x=y
这样位置就互换成功了!
作者:
熊永标
时间:
2013-4-1 09:03
本帖最后由 熊永标 于 2013-4-1 09:04 编辑
第一句:(x^=y)=(x=x^y)也就相当于用x去异或y的结果给x
第二句:(y^=x)=(y=x^y)也就相当于把x有值给y,因为一数异或另一个数偶数次,结果为这个数.把这
两句拼起为就是:x^y^y,根据原理,结果就等于x了
第三句:(x^=y)=(x=y^x)也就相当于把y有值给x,把第二句和第三句连接起来就是:y^x^y,换下位
位就是:x^y^y,根据异或特点,结为为x
总之就是把x和y的位置置换.
作者:
fighting
时间:
2013-4-1 09:04
change方法中两个值交换是利用了异或运算的可逆性
这是异或运算本身的性质决定的,这个性质常被用于加密算法
作者:
陈丽莉
时间:
2013-4-1 18:51
若还有问题,继续追问; 没有的话,将帖子分类改成【已解决】哦~
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2