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