关于通过异或交换两个元素的值的一个陷阱

来源:互联网 发布:中国海洋大学 知乎 编辑:程序博客网 时间:2024/06/05 01:23

#include <stdio.h>#include <iostream>using namespace std;void swap(int *a,int *b){*a = *a ^ *b;*b = *a ^ *b;//将a的值赋给了b*a = *b ^ *a;//将b的值赋给了a}int main(int argc, char *argv[]){int a[] = {1,1};int b[] = {1,2,3,4,5};swap(&a[0],&a[1]);//将数组b中的元素通过异或函数反转for(int i = 0,j = 4;i<=j;i++,j--){swap(&b[i],&b[j]);}//输出a,b两个数组中的值cout<<a[0]<<a[1]<<endl;//输出的结果是11cout<<b[0]<<b[1]<<b[2]<<b[3]<<b[4]<<endl;//输出的结果是54021return 0;}

相信很多人学c的时候都会接触到一个用异或来交换两个变量的值的函数,但是如果将这个函数应用到奇数长度的数组中的数组元素的反转中,则会出现一个意外的情况,那就是数组中间的那个元素会置为0,如果数组长度是偶数,那么则不会出现这种情况,如果是两个相等的变量进行异或交换的话,也同样不会出现这种情况,我查阅了一些资料,写下自己的一些理解。

如果像上面的数组中最中间的那个元素一样,自己跟自己异或的话,那么显然是会置位0的,自己跟自己异或三次,结果显然是0,但是如果是数组中的两个相等的元素进行异或交换的话,那么则不会出现这种情况,那么我们可以总结成以下一点:

如果两个变量是同一个对象的话,那么用异或进行交换是会被置为0的,如果两个变量是不同的两个变量,那么则不会出现这种情况,因为一个不同的变量在内存中的地址并不是相同的,一个变量的值的变换并不会影响另外一个变量的值,而如果是自己跟自己异或,那么在异或的函数中的第一步就会将自己置位0,显然结果就是0,这就是异或函数的陷阱!


0 0