黑马程序员技术交流社区

标题: 两个数字交换功能做成函数,为什么不行呢? [打印本页]

作者: wdtdcm    时间: 2014-2-16 15:32
标题: 两个数字交换功能做成函数,为什么不行呢?
本帖最后由 wdtdcm 于 2014-2-16 21:07 编辑
  1. class All{

  2.         public static void main(String[] args){
  3.                 int x=7,y=8;
  4.                 swap(x,y);
  5.                 System.out.print(x+"\t"+y);
  6.                         
  7.         }

  8.         //两个数字互换功能
  9.         public static void swap(int x,int y){
  10.                 x=x^y;
  11.                 y=x^y;
  12.                 x=x^y;
  13.         }
  14. }
复制代码




作者: hdsjsql    时间: 2014-2-16 15:51
基本数据作为方法的参数,是以值传递的方式进行,是单程的,在方法中参数的值被改变,不会改变参数的原有的值。
作者: 何苦似梦离    时间: 2014-2-16 15:53
JAVA不知道,不过C可以用指针,你可以试试引用.
作者: wdtdcm    时间: 2014-2-16 16:12
hdsjsql 发表于 2014-2-16 15:51
基本数据作为方法的参数,是以值传递的方式进行,是单程的,在方法中参数的值被改变,不会改变参数的原有的 ...


请问大概是这个意思吗?
那么我在堆中开个数组,存放两个数字有用吗?


作者: hdsjsql    时间: 2014-2-16 16:14
基本数据类型传递的是值,而引用类型传递的是地址,。数组属于引用。
作者: skyname    时间: 2014-2-16 16:30
主函数在调用swap(x,y);的时候,只是将main函数中x和y的值的副本(复制一份)传递到了swap函数中,所以在swap函数中交换的只是x,y的副本,原来的main函数中的x、y值并未被改变。
作者: wdtdcm    时间: 2014-2-16 16:51
skyname 发表于 2014-2-16 16:30
主函数在调用swap(x,y);的时候,只是将main函数中x和y的值的副本(复制一份)传递到了swap函数中,所以在sw ...

原来如此,那么这个功能该怎么实现呢?传个数组进去倒是可以对数组进行操作。但是麻烦。

。。。。。。还是继续跟上视频吧,毕竟才第4天:funk:
作者: 杨殿生    时间: 2014-2-16 16:58
定义函数的时候返回值类型应该用int型
作者: wdtdcm    时间: 2014-2-16 17:04
杨殿生 发表于 2014-2-16 16:58
定义函数的时候返回值类型应该用int型

。。。用int返回值,返回什么呢?。。。返回值用不上。



作者: 疲劳的小马    时间: 2014-2-16 19:35
主函数虽然调用了swap(x,y)的方法,但是只是将变量x,y的值作为参数传递进函数进行了调换,调换后的结果与原变量的值无关,因为并未有返回操作对原有变量进行赋值。修改可以将变量的值存入数组进行置换,也可以将主函数的输出语句写到swap()函数内部:

  1. class Demo
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 int x=1,y=2;
  6.                 swap(1,2);
  7.         }
  8.         public static void swap(int a,int b)
  9.         {
  10.                 a=a^b;
  11.                 b=a^b;
  12.                 a=a^b;
  13.                 System.out.println("置换后x的值是:"+a+",置换后y的值是:"+b);
  14.         }
  15. }
复制代码

作者: 严旭晟    时间: 2014-2-16 20:39
你可以尝试一下用数组,传数组名。
  1. public class SwapDemo
  2. {
  3.    public static void Swap(int arr[])
  4.    {
  5.         int tmp;
  6.         tmp = arr[0];
  7.         arr[0] = arr[1];
  8.         arr[1] = temp;
  9.    }
  10.    public static void main(String args[])
  11.    {
  12.        int []array = new int[2];
  13.        array[0] = 5;
  14.        array[1] = 6;
  15.        Swap(array);  //传数组名
  16.        System.out.println(array[0]+"  "+array[1]); //打印
  17.    }
  18. }
复制代码

作者: 严旭晟    时间: 2014-2-16 20:53
当然,也可以不借助中间变量,见代码如下:
  1. //不借助中间变量,采用异或运算以及数组
  2. public static void fastSwap(int array[])
  3. {
  4.    array[0] = array[0]^array[1];
  5.    array[1] = array[0]^array[1];
  6.    array[0] = array[0]^values[1];
  7. }
复制代码

用fastSwap()替换上楼的Swap()函数即可!
作者: 严旭晟    时间: 2014-2-16 21:06
如果只是要显示的结果的话,可以不用调用交换函数,见代码如下:
  1. public class Demo
  2. {
  3.    public static void main(String []args)
  4.    {
  5.       int x= 5,y =6;

  6.       System.out.println("交换前,x的值:"+x+",y的值:"+y);
  7.       y = x+0*(x=y);
  8.       System.out.println("交换后,x的值:"+x+",y的值:"+y);

  9.    }
  10. }
复制代码

作者: 严旭晟    时间: 2014-2-16 21:07
好像利用构造对象和设置属性也可以




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2