现在的位置: 首页 > 综合 > 正文

不使用临时变量的情况下,两个变量之间交换值的问题

2013年09月02日 ⁄ 综合 ⁄ 共 515字 ⁄ 字号 评论关闭

这算是我的第一篇博客吧,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;

 

抱歉!评论已关闭.