ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

不一样的数值交换

不一样的数值交换 #include stdio.h void swap1(int a, int b) { int temp a; //使用局部变量 temp 完成交换 a b; b temp; };这段代码是用临时变量引用参数实现交换是最稳妥的写法。但是将数a、b的值进行交换并且不使用任何中间变量。无中间变量两种写法1. 加减法存在溢出风险void swap(int a, int b){a a b;b a - b;a a - b;}2. 异或法推荐无溢出但a、b不能是同一个变量void swap(int a, int b){a ^ b;b ^ a;a ^ b;}int main(void) { int a1 1, b1 2; int a2 3, b2 4; int a3 5, b3 6; int a 2147483647, b 1; swap1(a1,b1); //测试使用临时变量进行交换的版本 swap2(a2,b2); //测试使用加减运算进行交换的版本 swap3(a3,b3); //测试使用异或运算进行交换的版本 printf(after swap...\n); printf(a1 %d, b1 %d\n, a1, b1); printf(a2 %d, b2 %d\n, a2, b2); printf(a3 %d, b3 %d\n, a3, b3); swap2(a, b); printf(a %d, b %d\n, a, b); return 0; }总结本例分别用临时变量、加减运算、异或运算三种方式实现数值交换。swap1 借助临时变量逻辑直观安全swap2 利用加减法但存在整数溢出风险swap3 依靠异或无需额外变量但不能处理相同地址变量。C 语言值传递特性下直接传参无法修改主函数变量需传入指针才能完成交换。三种 swap 对比小结swap1临时变量最稳妥无溢出、无同地址清零问题工程首选swap2加减无额外变量但有溢出 同地址清零风险只适合确定相加不会越界场景swap3异或无溢出但是同地址会清零不能传入同一变量地址swap3异或无溢出但同地址会清零需要加 if (xy) 判断给出优化后的 swap3函数#include stdio.h void swap3(int *x, int *y) { if (x y) { return; } *x *x ^ *y; *y *x ^ *y; *x *x ^ *y; } int main(void) { int a3 5, b3 6; swap3(a3, b3); printf(a3%d, b3%d\n, a3, b3); int num 100; swap3(num, num); // 传入相同地址不会破坏数据 printf(num%d\n, num); return 0; }
返回列表