怎么交换两个变量的值啊?

207 阅读3分钟

自上第一节C语言编程课老师就教了我们怎么对一个变量进行赋值,怎么对两个变量的值进行交互,也就很简单的语句:

int a=1;int b=3;

int temp=a;

a=b;

b=temp;

那么简单的操作谁都会啊,但最近在一场面试中被面试官问到了这样一个问题:不使用定义使用额外变量的情况下如何交换两个变量的数值?我在想指针可以吗?但也要保存地址啊,想了好一会都没有什么头绪。

面试结束后我问了一下ChatGPT,回答的结果是这样的: 一种常见的方法是使用加减法:

假设有两个变量 a 和 b,需要交换它们的数值。

步骤如下:

  1. 将变量 a 的值与变量 b 相加,并将结果赋值给变量 a: a = a + b
  2. 从变量 a 中减去原始的变量 b 的值,并将结果赋值给变量 b: b = a - b
  3. 从变量 a 中减去原始的变量 b 的值(此时相当于 a + b - b = a),并将结果赋值给变量 a:a = a - b

完成上述步骤后,变量 a 和变量 b 的数值就已经互换了。

需要说明的是,这种方法只适用于数值类型的变量,对于其他类型(如字符串)可能会导致不可预料的结果,所以请谨慎使用。而且这种方法在某些语言或特定情况下可能会存在溢出的问题,需要注意数值范围和边界条件。

还有一个方式是还有一种叫做异或运算(XOR)的方式来交换两个变量的值,我估计这才是面试官想要的答案代码如下:

a = a ^ b;
b = a ^ b;
a = a ^ b;

这种方法的原理是基于异或运算的特性。异或运算的规则是:如果两个二进制位不同,则结果为1,否则为0。因此,如果我们把一个数与另一个数异或两次,那么原来的值会被还原,具体过程如下:

假设a的值是1010,b的值是1101,我们希望交换a和b的值,那么可以通过如下步骤实现:

a = a ^ b;  // a = 1010 ^ 1101 = 0111
b = a ^ b;  // b = 0111 ^ 1101 = 1010
a = a ^ b;  // a = 0111 ^ 1010 = 1101

经过以上三步操作,a和b的值已经实现了交换。使用异或运算交换变量值的优点是代码简洁,但也有其缺点,即可能会因为位运算导致代码可读性降低,以及在某些情况下可能会出现不可预知的行为。

需要注意的是这两种方式应该也只适合在特定的情况下,数值类型或bool类型的情况下。

得到答案后我才恍然大悟,这两种方式我也不是没见过,但都被忽视掉了,平常也不怎么使用,但却真的很巧妙。最后面试黄了,因为校招的大公司更看重的是基础,并不仅仅是项目、经验这些。

如果这篇文章对你有所收获,麻烦点个赞吧,这不会给我带来任何收益,但也会激励我继续创作,非常感谢!