一道有意思的C语言试题
题目:void inplace_swap(int *x, int *y)
{
*y = *x ^ *y;
*x = *x ^ *y;
*y = *x ^ *y;
}
void reverse_array(int a[], int count)
{
int first, last;
for( first=0, last=count-1; first <= last; first++, last-- )
{
inplace_swap(&a, &a);
}
}
以上代码段的作用是将数组a的元素头尾两端依次对调,那么有如下问题:
1. 解释下inplace_swap()利用异或能实现两数交换的原理?
2. 当数组中包含数字1,2,3,4时,代码可以正常运行,得到4,3,2,1。但如果数组中包含1,2,3,4,5时,你会发现结果是5,4,0,2,1。请问中间的0是从何而来的?
3. 对reverse_array的代码做哪些简单改动就能消除题目2存在的问题呢?
详细答案(回复可见):
**** Hidden Message ***** 跟看那个不用第三个数交换一样神奇 对答案啦!!!!!!!! 谢谢小甲鱼老师 A 二进制运算 B 感觉是因为数组奇偶性的问题 C 加多个判断~~~~感性认知 看下答案~~~ B:是因为下标为2 时 x,y指向的内存是同一个,当执行第一条*y = *x ^ *y; 时,*x ^ *y = 0;将0赋值给*y那么*x的值也会被改变 1.利用了二进制运算(在零基础入门学习C语言64视频里有的)
2.因为 first==last 的时候,内存指向同一地址,*y = *x ^ *y就会等于0,相同的数异或都为0
3.修改first <= last为first < last就OK。void inplace_swap(int *x, int *y)
{
*y = *x ^ *y;
*x = *x ^ *y;
*y = *x ^ *y;
}
void reverse_array(int a[], int count)
{
int first, last;
for( first=0, last=count-1; first < last; first++, last-- )
{
inplace_swap(&a, &a);
}
} 膜拜了,学习中 看下答案:dizzy: 这个要看
好东西!!
3跟3自己异或。。坑啊。:L 看下答案啊 对答案哈哈 看看看看~~~~~ 开的就是结果暗暗啊啊 一道有意思的C语言试题 1、能完成两个数的交换保证了不会出现越界的问题
2、相同的两个数之间的异或得到的数是零
3、在13行加判断因为所给数列有序所以只要判数是否相等就可以了
if (a==a)
continue;
学习 看答案啦