黑马程序员技术交流社区

标题: 两变量分别赋值,不使用第三方变量怎么让它们交换值? [打印本页]

作者: 雷向阳    时间: 2012-10-6 21:00
标题: 两变量分别赋值,不使用第三方变量怎么让它们交换值?
例如:a=10,b=15,怎么把a,b的值互换?
作者: 陈顺亮    时间: 2012-10-6 21:04
a=a+b;
b=a-b;
a=a-b;
Console.WriteLine("交换后值为a:{0},b:{1}",a,b);

作者: 何学强    时间: 2012-10-6 21:07
可以通过普通的+和-运算来实现:
imt a,b;
a=10;b=15;
a=b-a;//a=5,b=15
b=b-a;//a=5,b=10
a=b+a;//a=15,b=10

作者: 刘俊红    时间: 2012-10-6 21:11
本帖最后由 刘俊红 于 2012-10-7 10:55 编辑

也可用位运算中对的「异或^」,好处是相比+-不会溢出,但是只能用在整型和bool型上,引用类型之类统统不行。
  1. using System;

  2. namespace 交换2
  3. {
  4.     class Program
  5.     {
  6.         static void Main(string[] args)
  7.         {
  8.             int a = 10;
  9.             int b = 15;

  10.             a = a ^ b;
  11.             b = b ^ a;
  12.             a = a ^ b;

  13.             Console.WriteLine("{0}   {1}",a,b);
  14.         }
  15.     }
  16. }
复制代码

作者: 雷向阳    时间: 2012-10-6 21:11
何学强 发表于 2012-10-6 21:07
可以通过普通的+和-运算来实现:
imt a,b;
a=10;b=15;

能不能说得明白点,a=b-a?前一个a和后一个a的值分别是多少呢?为什么?其实我也查了答案的,但是还是有点想不过来。。。
作者: 管海鹏    时间: 2012-10-6 21:25
这个哦。呵呵
.a=1,b=2,不用第三个变量,a,b互换?
我记得测试题里面有的哦

1.
a=a+b
b=a-b
a=a-b

2.
a=a^b
b=b^a
a=a^b
原理就不说了直接上代码了
作者: 神马王刚    时间: 2012-10-6 21:53
本帖最后由 神马王刚 于 2012-10-6 21:54 编辑

其实仔细想想就明白了.
第一步,把2个变量的和赋给第1个变量,那么这时候两个变量分别存的值就是  和 \  第2个变量的值
第二步,用和减去第2个变量,得到的值是原来第一个变量的值,而我们却把这个值赋给第2个变量,这样两个变量分别存储的值就是和\交换后第2个变量的值
第三部,因为交换后两变量和不变,因此用和减去新得到的变量2的值,就得到了新的变量1的值.这时候就相当于完成交换,两变量的值对调了.

关键就在于,你要把=当作赋值运算的符号,不能看作==等于,把它右边的式子当作一个整体,就好理解,不然就可能会迷糊
作者: 邓艳秋    时间: 2012-10-6 21:57
int a=10;
int b=15;
a=a+b;-----把a+b的值赋给a,那么a的值现在为25了
b=a-b;-----把a-b的值赋给b,b的值就为25-15=10了
a=a-b;-----把a-b的值赋给a,注意,这时候a的值为25,b的值为10,最后赋给a的值就是25-10=15;
实现了交换。

作者: 蔡嘉    时间: 2012-10-8 21:33
a=a+b  -->  a=25
b=a-b  -->  b=10
a=a-b  -->  a=15          -->实现互换
位运算不太会,原理是二进制数的计算,异或(相同为0,不同为1)
10的二进制:00001010  -->a
15的二进制:00001111  -->b
a=a^b=00000101  -->5
b=b^a=00001010  -->10
a=a^b=00001111  -->15
用异或莫名其妙就交换了!不知是谁想出来的?为什么这样就能交换呢?
作者: 曾家伟    时间: 2012-10-9 09:42
用a+b的我就不说了主要说说异或吧
分别将a和b换算成二进制,即
00001010
00001111
--------------
00000101
然后将00000101转成十进制5赋给a;下面的同理
作者: servant4335    时间: 2012-10-9 15:09
a = b + (b = a) * 0;

ok了
作者: 邓江红    时间: 2012-10-9 21:31
             int number1 = 5, number2 = 10;
            number1 = number1 + number2;   //将两个变量的值相加赋给number1
            number2 = number1 - number2;   //将两个数的差5赋给number2
            number1 = number1 - number2;   //将两个数的差10赋给number1
            Console.WriteLine("number1的值是:" + number1);
            Console.WriteLine("number2的值是:" + number2);
            Console.ReadKey();
作者: 潘梦军    时间: 2012-10-10 09:11
servant4335 发表于 2012-10-9 15:09
a = b + (b = a) * 0;

ok了

这个算法好强悍,之前没想到过
作者: servant4335    时间: 2012-10-10 19:29
潘梦军 发表于 2012-10-10 09:11
这个算法好强悍,之前没想到过

这个主要是正常的不会在一个表达式里写两个等号
只要知道等号在c#中是赋值不是等于的意思就很好理解了
:)
作者: chens2865    时间: 2012-10-23 11:37
int a=10;
int b=15;
a=a+b;
b=a-b;
a=a-b;-----注意,此时a的值为25,b的值为10,实现了不依靠第三个变量进行交换。




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