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

本文探讨了一种在C++中看似可行但实际无法正确交换两个变量值的方法,并提供了一个使用位运算符进行变量交换的巧妙解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值