不用临时变量直接交换两个数的值

以前偶尔从同学那里知道原来交换两个数的值并不一定需要临时变量,直接用这个两个数就可以直接交换,但当时没有仔细记住,突然想起来就去搜了一下,发现不止一种方法,现总结如下:

方法一:利用C语言提供的异或运算

a = a ^ b;

b = b ^ a;

a = a ^ b;

原理:第一步执行了a = a ^ b;则第二步b = b ^ a就相当于b = b ^ (a ^ b) = a ^ b ^ b = a ^ 0 = a;第三步a = a ^ b就相当于a = (a ^ b) ^ (b ^ (a ^ b)) = b。

也可以将三条语句缩写为一条a ^= b ^= a ^=b;


方法二:只利用加减法来实现

a = a + b;

b = a - b;

a = a - b;


方法三:利用算术运算符的结合顺序(自左至右)

p = p + q - (q = p);

(此方法经验证是错误的,因为在计算的过程中先将q赋值为p,然后算出的结果就为p = p + p - p = p,所以此行代码只是将q赋值为了p,p的值并没有改变)

原来在编程的过程中除了那些常规的做法外可以有很多小技巧的,暂时不知道到底有什么用,就是觉得很神奇,搜集了一下,嘿嘿


通过指针直接交换个数而不使用额外的临时变量,在 C/C++ 中是一种常见的技巧。下面将为你详细介绍如何利用指针完成这一操作,并附上简单的示例代码。 ### 操作原理 假设我们有个整型数 `a` 和 `b` ,想要将其内容互换而不用借助第三个辅助空间。对于这种情况,可以采用数学运算的方式来进行数据转换: 1. **加减法**:先让其中一个数字加上另一个,则该位置保存了者之和;然后从这个总和里扣除原第二个数得到第一个原始并赋给后者;最后再用新得到的结果去更新前者即可。 - a = *pa; - b = *pb; 2. **异或 (XOR)** :更巧妙的是运用位元运算符中的“按位异或”,这种方式不会引起溢出的问题。它依赖于以下特性: - x ^ x == 0 (任意数与其自身做 XOR 运算结果为零) - x ^ 0 == x (任一数与零作 XOR 结果不变) 因此只需要对个待交换的位置连续进行三次相同的 XOR 操作就可以达到目的了。 ```c++ void swapWithoutTemp(int* pa, int* pb) { if(pa != nullptr && pb != nullptr){ // Method using arithmetic operations /* * *pa += *pb; * *pb = *pa - *pb; * *pa -= *pb; */ // OR //Method Using Bitwise XOR Operation if (*pa != *pb) *pa ^= *pb ^= *pa ^= *pb ; } } ``` 需要注意的一点是在某些特殊情况下,比如当个指向同一内存地址时(即自引用),上面提到的方法可能会导致不可预期的行为。所以在实际编写程序的时候应该考虑到这一点,增加适当的判断条件来避免潜在的风险。 此外,虽然上述方法确实实现了不使用临时变量的目标,但从可读性和安全性角度来看,通常还是推荐使用一个明确声明的临时变量来进行交换,特别是在处理复杂的数据结构或是需要保证线程安全性的环境中更是如此。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值