在不用第三方参数的情况下,交换两个参数的值 C++/C

答案是;
i^=j;
j^=i;
i^=j;
这个回答很有特色,请解答写思路,月详细越好啊~~

i^=j; ==> i = i ^ j;
j^=i; ==> j = j ^ i;
i^=j; ==> i = i ^ j;

由i = i ^ j 那么 j = j ^ i = j ^ i ^ j;
==>j = i ^ j ^ j; 因为 j ^ j为0,
==>i ^ 0 等于 i, 所以j = i;

最后一行跟上面一样的分析。

这里就是用到了异或的特性罢了。
就是一个数与另外一个数异或的结果再与这个数异或就会得到其原值。

如:a == a ^ b ^ b;

上面这个用得很巧,巧就巧在他们无形中使用了中间变量。

因为第二行的时候的i已经是他们第一次异或的结果了,所以再异或一个就得到了i本身的值,所以j的值就是原来i的值了。

而这时j就相当于最初的i了,而i则是他们第一次异或的结果,那么两者异或就相当于j的值了。

你去思考一下这个:如果三个数满足任意两个数的异或结果等于第三个数。那么他们就满足上面的情况。

其实原理就是这样的了。

这个确实很难想到的啦。
温馨提示:内容为网友见解,仅供参考
第1个回答  2010-11-08
这是按位“异或”来运算
i^=j;相当于i=i^j;-----①
j^=i;相当于j=j^i;-----②
i^=j;相当于i=i^j;-----③
前面两个赋值语句相当于j=j^(i^j),也就是j=j^i^j,也即j=i^j^j=i^(j^j)=i^0==i,故①②相当于把i的值赋给j。
第三个赋值语句:i=i^j----i=(i^j)^(j^i^j),i=i^i^j^j^j=j;故③相当于把j赋给i。
注意0^n=n!!!
自认为讲清楚了,还有疑问请单线联系,希望采纳为答案!!!
第2个回答  2010-11-08
你给的这个答案真的行吗???
我有另外一个方法,不用第三个参数:

int i = 2, j = 3;

i = i + j;//执行后 i = 5, j = 3
j = i - j;//执行后 i = 5, j = 2
i = i - j;//执行后 i = 3, j = 2
第3个回答  2010-11-08
i=i*j;
j=i/j;
i=i/j;

在不用第三方参数的情况下,交换两个参数的值 C++\/C
==>i ^ 0 等于 i, 所以j = i;最后一行跟上面一样的分析。这里就是用到了异或的特性罢了。就是一个数与另外一个数异或的结果再与这个数异或就会得到其原值。如:a == a ^ b ^ b;上面这个用得很巧,巧就巧在他们无形中使用了中间变量。因为第二行的时候的i已经是他们第一次异或的结果了...

C++问题 交换两个数的值
x,y的是定义在函数内部的变量,只能在函数内部使用,函数结束后,x,y就不存在了。你在写函数的时候,完成了x,y的交换,但是并没有通过返回函数或指针把结果会写到i1,i2.和d1,d2。如果你不理解为什么i1和x,i2和y对应的不是同一个东西的话,请阅读C语言教程里关于函数的形参和实参的相关内...

c++怎样用一个函数返回两个参数?
int *b,int *l,int *angle)\\x0d\\x0a{\\x0d\\x0a\/\/进行相应的操作\\x0d\\x0a\/\/比如...\\x0d\\x0a*l += *a;\\x0d\\x0a*angle += *b;\\x0d\\x0a\/\/不需要return,l、angle的值已经改变了,因为传递函数参数是指针类型\\x0d\\x0a}\\x0d\\x0a\\x0d\\x0avoid main()\\x0d\\x0a{\\...

c语言中交换两个数据,为什么数组是地址传递捏
回答:如果是不是传地址,那会在函数中重新定义两个变量分别等于两个参数的值,对新定义的两个变量进行操作。和原来的两个变量无关。 如果是传地址,那就是把两个数的地址传到函数中,对两个地址中的内容进行操作。所以会改变两个数的值。 一般如果要通过函数来改变参数的值,C都是要用传地址的,C++还...

设计C++程序,交换两个整型变量的值
void exchange(int &a,int &b);int main(int argc, char const *argv[]){ int a;int b;cout << "please input two numbers" << endl;cin >> a >> b;exchange(a, b);cout << a << " "<< b << endl;return 0;} void exchange(int &a,int &b){ int temp;temp = a;a...

C++在不用指针或数组的情况下,怎样返回两个或多个值?
C++在不用指针或数组的情况下无法返回多个值,return 只能返回一个值,而且这个值是个数值(指针是内存地址,也是个数值)想返回多个值,可采用以下方法:一、通过函数参数返回 void max_min( int *a, int n, int *max, int *min ) \/\/若想带回数据,返回的参数必须是指针类型{ int i; ...

c++指针交换两个字符串的内容
首先,虽然传递的是地址,但是仍然是属于传值调用的范畴。因为指针只是用来赋值,并没有被间接引用。那么你是不是想用传址调用呢,就这个程序而言,也是不行的。你希望通过交换str1和str2的值来实现字符串的赋值,是行不通的。因为,在C++中,任何一个数组的名,都是一个指针,相信这个你也知道,...

在c++中怎么用异或把两个字符互换?
不用中间变量交换两个变量的值:1、加减法:该方法可以交换整型和浮点型数值的变量,但在处理浮点型的时候有可能出现精度的损失。a = a + b;b = a - b;a = a - b;2、异或法:可以完成对整型变量的交换,对于浮点型变量它无法完成交换。a = a^b;b = a^b;a = a^b;3、乘除法:可以...

在C++中能够在函数的形参表中赋值吗?
(2)默认参数的定义顺序是自右向左。即如果设置了一个缺省值,其右边的参数也应该设定一个缺省值。即:复制代码 代码如下:int add(int a,int b=1,int c=1); (3)默认参数的调用顺序是自左向右。在使用函数的时候,实参必须是由左自右书写的。复制代码 代码如下:\/*正确的用法*\/ add(1,2...

C++习题:输入两整数交换后输出
按你写的那种方式,传递参数只是把值赋给这个两个局部变量 所以说你这个函数 只是将这个函数的两个局部变量的颠倒了一下 作为实参的变量x y 站在一边看热闹 跟他们一点关系都没有 从全局来看呢就是这样的 a=x,b=y t=a;a=b;b=t; 这样你理解x y为啥没有交换了吧 好 明白为什么错了 开始说...

相似回答