不使用临时变量的情况下,两个变量之间交换值的问题
2011-04-18 22:58
302 查看
这算是我的第一篇博客吧,O(∩_∩)O~今天偶然学习到一个小知识:
[原文如下:
目的是想交换a和b的值。
int a=30,b=40;
a=a+b-(b=a);
这种方法貌似是不行的,大家可以帮忙分析一下吗?
对于这种情况,有没有改正的好方法...]
在C++操作符中除了作用域解析操作符“::”外,“()”的优先级是最高的,所以肯定会先计算()里的,这样b先就等于30了,所以结果a=30,b=30。
如果改成:
a=30,b=40;
a=(a+b)-(b=a);
结果也是a=30,b=30。
原因是,仅当两个操作符被用于同一个操作数时,优先级和结合性规则才有效,如sum=3+4*5,而当出现下面这种情况时sum=20*5+24*6,优先级和结合性都没有指出应该先计算哪一个乘法,因为两个*操作符并没有用于同一个操作数。事实上,C++把sum=20*5+24*6这种先计算哪个乘法的问题留给了实现,让它来决定在系统中的最佳顺序。而最终,a=(a+b)-(b=a)类似于sum=20*5+24*6,所以a=(a+b)-(b=a)也无法确定会先计算哪一个(),最终也得不到想要的结果。
但是有一种比较巧妙的方法:
a = a^b;
b = a^b;
a = a^b;
[原文如下:
目的是想交换a和b的值。
int a=30,b=40;
a=a+b-(b=a);
这种方法貌似是不行的,大家可以帮忙分析一下吗?
对于这种情况,有没有改正的好方法...]
在C++操作符中除了作用域解析操作符“::”外,“()”的优先级是最高的,所以肯定会先计算()里的,这样b先就等于30了,所以结果a=30,b=30。
如果改成:
a=30,b=40;
a=(a+b)-(b=a);
结果也是a=30,b=30。
原因是,仅当两个操作符被用于同一个操作数时,优先级和结合性规则才有效,如sum=3+4*5,而当出现下面这种情况时sum=20*5+24*6,优先级和结合性都没有指出应该先计算哪一个乘法,因为两个*操作符并没有用于同一个操作数。事实上,C++把sum=20*5+24*6这种先计算哪个乘法的问题留给了实现,让它来决定在系统中的最佳顺序。而最终,a=(a+b)-(b=a)类似于sum=20*5+24*6,所以a=(a+b)-(b=a)也无法确定会先计算哪一个(),最终也得不到想要的结果。
但是有一种比较巧妙的方法:
a = a^b;
b = a^b;
a = a^b;
相关文章推荐
- 如何在不使用临时变量的情况下交换两个变量的值?
- JS——交换两个变量(不使用第三个变量的情况下)
- C中不使用临时变量交换两个变量的值
- 让人泪奔的方法:两个变量在不使用其他变量的情况下进行数据交换
- 没有临时变量的情况下,交换两个值。
- 算法研究之不使用临时变量实现两个值的交换
- C中不使用临时变量交换两个变量的值(作者:yxin1322;blog:http://blog.csdn.net/yxin1322)
- 不使用临时变量交换两个变量的值(异或,加减,乘除)
- 不使用临时变量交换两个变量的值---这种算法有溢出的可能
- 不使用临时变量而交换两个整形数
- 不用临时变量 实现两个变量之间的数据交换
- 实现两个int变量的值的交换,要求不使用临时变量。
- 让人泪奔的方法:两个变量在不使用其他变量的情况下进行数据交换
- 不使用临时变量交换两个值
- 不使用临时变量交换两个变量的值
- 使用位运算交换两个值,不用临时变量
- 不使用第三个变量实现两个整数之间的交换
- 不使用临时变量 依次交换两个已知数组的值
- 关于两个变量不使用临时变量进行值交换
- 不使用临时变量交换两个变量的值