前几天写到一个字符串中前后字符交换的程序,使用的是异或,即:
a = a ^ b;
b = a ^ b;//(a^b)^b与同一个数b两次异或,不改变a的值
a = a ^ b;//(a^b)^a,与同一个数a两次异或,不改变b的值
希望达到交换的目的,然后用%s格式符输出,结果总是不能完全输出字符,源程序如下:
#include<stdio.h>
//#define solution1 //采用第一种方法
int main()
{
int lp_c[] = {2};
int a, b;
int i;
printf("%s\n", lp_c);
#ifdef solution1
//第一种方法
a = lp_c[0];
b = lp_c[0];
printf("交换前:lp_c[0] = a = b = %d \n", a);
a = a ^ b;
b = a ^ b;//(a^b)^b与同一个数b两次异或,不改变a的值
a = a ^ b;//(a^b)^a,与同一个数a两次异或,不改变b的值
#else
//第二种方法,!!!错误,对于同一变量没办法通过异或来与自身交换
printf("交换前:lp_c[0] = %d\n", lp_c[0]);
lp_c[0] = (lp_c[0]) ^ (lp_c[0]);//lp_c[0] = '0';
lp_c[0] = (lp_c[0]) ^ (lp_c[0]);
lp_c[0] = (lp_c[0]) ^ (lp_c[0]);
#endif
printf("交换后:lp_c[0] = %d\n", lp_c[0]);//输出字符串的ASCII码
return 0;
}
调试了一个晚上,终于找出原因,异或交换式不能用于交换同一个数的,平常不会出现这种情况,但是指针操作时会出现指针指向同一地址的状况。