题目:不能创建临时变量(第三个变量),实现两个整数的交换
1.用临时变量来实现(常规写法)
这种方法是最直观的,但题目要求不使用临时变量,所以这里仅作为对比参考。
用创建临时变量来写:逻辑清晰,更便于理解,也是在正常情况下的书写方法。
int main()
{
//创建临时变量
int a = 3;
int b = 5;
printf("%d %d\n", a, b);
int tmp = a;//临时变量tmp
a = b;
b = tmp;
printf("%d %d\n", a, b);
return 0;
}
2.不创建临时变量的写法
2.1第一种写法:
通过加减运算的方法,在整数范围足够大(不溢出)的情况下可以工作。
注意:如果a
和b
的和超出了int
的范围,这种方法会导致溢出,从而无法正确交换值。
int main()
{
int a = 3;
int b = 5;
printf("%d %d\n", a, b);
a = a + b;
b = a - b;
a = a - b;//当a和b分别不溢出的时候,但是和溢出的时候,不合适
printf("%d %d\n", a, b);
}
2.2第二种写法:
用^(异或操作符)来实现目的
利用了异或运算(XOR)的特性来交换两个整数的值,且不涉及任何溢出问题。
int main()
{
int a = 3;
int b = 5;
printf("%d %d\n", a, b);
a = a ^ b;
b = a ^ b;//(a^b)^b=a
a = a ^ b;//(a^b)^a=b //当a和b分别不溢出的时候,但是和溢出的时候,不合适
printf("%d %d\n", a, b);
return 0;
}
1.a = a ^ b;:此时a存储了a和b的异或结果。
2.b = a ^ b;由于a现在是a XOR b,所以b = (a XOR b) XOR b。根据异或运算的性质,x XOR x = 0和x XOR 0 = x,所以b变成了原来的a。
3.a = a ^ b;:此时b已经是原来的a,所以a = (a XOR b) XOR a。由于b是原来的a,所以a变成了原来的b