将两个整形变量交换(不使用临时变量),看完你才会发现还有这么多门道

这里我们来说一下这个题:将两个整形变量啊a,b进行交换。

  • 传统的引用临时变量的方法
#include<stdio.h>
int main()
{
    int a = 10;
    int b = 20;
    int tmp = 0;
    tmp = a;
    a = b;
    b = tmp;
    printf("%d%d",a,b);
    return 0;
}

此处使用的是vs2017进行编译,截图效果如上。相信大家会发现这有点不一样,编译器上多了两行代码,第一句#define _CRT_SECURE_NO_WARNINGS 1我在上一篇文章中已经提到了,大家可以去参考上一篇文章,还多了一句system("pause");

我这里解释一下,vs一些版本编译运行时会出现程序框一闪而过的问题,为了解决这个问题,在代码最后加入这个system指令让它编译执行完毕在那暂停一下。

如此我们发现引入临时变量tmp很简单就可以实现两个变量之间的交换。

那么我们要是给这个题加上一个附加条件:不能创建临时变量

这里我发现通过加减法的方式可以实现

#include<stdio.h>
int main()
{
   int a = 10;
   int b = 20;
   a = a + b;
   b = a - b;
   a = a - b;
   printf("%d  %d",a,b);
   return 0;
}

我们会发现这个代码也可以实现交换,然而如果a,b两个数如果较大呢?这时两数相加的话就会超出int类型能表示的最大数,这时就会出现溢出的状态,那么这个代码执行出来将会得到错误的结果。所以我将再介绍另一种方法;

  • 异或法。这个方法采用的时计算机二进制异或的运算方法,先奉上代码和测试结果:
    #include<stdio.h>
    int main()
    {
    	int a = 10;
    	int b = 20;
            a = a ^ b;
            b = a ^ b;
    	a = a ^ b;
    	printf("%d  %d", a, b);
    	return 0;
    }

这里异或(^)的使用有人可能了解,我稍微举个例子讲解一下:

就用a=10,b=20来举例

10的二进制     01010
20的二进制     10100

     01010           11110              11110     
   ^ 10100         ^ 10100            ^ 01010
     
     11110           01010              10100

   

    这里我们先将10和20的二进制进行异或操作,发现得到一个数。我列举了这三个数两两之间相互异或,我们会发现,总是其中两个数异或得到另一个数,那么我们可以把这第三个数就跟之前讲的创建的临时变量作用相当了,起到一个转换的作用。看不太明白的可以自己试试把两个数异或计算一下,相信不会特别困难。

     看完这些,你是不是觉得这么简单的一道题竟然有这么多讲究 。哈哈,没关系,如果你下去再查找一些资料,你还会发现一些其他的方法,所以呢,千万不要小瞧任何一道简单的题,许多人都是阴沟里翻船的。

      如果你还有其他的方法,望您不吝赐教,小弟在此先行谢过!

      

猜你喜欢

转载自blog.csdn.net/Watery________1314/article/details/82779996