自上第一节C语言编程课老师就教了我们怎么对一个变量进行赋值,怎么对两个变量的值进行交互,也就很简单的语句:
int a=1;int b=3;
int temp=a;
a=b;
b=temp;
那么简单的操作谁都会啊,但最近在一场面试中被面试官问到了这样一个问题:不使用定义使用额外变量的情况下如何交换两个变量的数值?我在想指针可以吗?但也要保存地址啊,想了好一会都没有什么头绪。
面试结束后我问了一下ChatGPT,回答的结果是这样的: 一种常见的方法是使用加减法:
假设有两个变量 a 和 b,需要交换它们的数值。
步骤如下:
- 将变量 a 的值与变量 b 相加,并将结果赋值给变量 a: a = a + b
- 从变量 a 中减去原始的变量 b 的值,并将结果赋值给变量 b: b = a - b
- 从变量 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类型的情况下。
得到答案后我才恍然大悟,这两种方式我也不是没见过,但都被忽视掉了,平常也不怎么使用,但却真的很巧妙。最后面试黄了,因为校招的大公司更看重的是基础,并不仅仅是项目、经验这些。
如果这篇文章对你有所收获,麻烦点个赞吧,这不会给我带来任何收益,但也会激励我继续创作,非常感谢!