几年前的某一天,在学校,我不得不做一个交换函数,交换两个整数,我想不使用第三个变量,用按位运算来实现,所以我想出了这样的方法:
void swap( int * a, int * b ) {
*a = *a ^ *b;
*b = *a ^ *b;
*a = *a ^ *b;
}我认为它很好,但是当我的功能被学校的修正程序测试时,它发现了一个错误(当然,当我问他们不想告诉我的时候),但是今天我仍然不知道什么不起作用,所以我想知道在这种情况下这种方法是行不通的。
发布于 2022-09-30 22:53:00
--我想在不使用第三个变量的情况下使用按位操作来完成这一任务。
你介意我问一下为什么吗?这一限制是否有实际的原因,还是仅仅是一个智力上的难题?
当我的函数被学校的校正程序测试时,它发现了一个错误
我不知道纠正程序在抱怨什么,但是已知这种解决方案失败的一类输入就是这样的例子。
int x = 5;
swap(&x, &x);
printf("%d\n", x);这个打印的是0,而不是5。
你可能会说,“为什么有人要和自己交换一些东西呢?”他们可能不会,正如我所展示的,但也许你可以想象,在一个平庸的书面排序算法中,它可能最终会完成相当于
if(a[i] < a[j]) {
/* they are in order */
} else {
swap(&a[i], &a[j]);
}现在,如果i和j是相同的,那么swap函数将错误地将a[i]归零。
另见What is the difference between two different swapping function?
https://stackoverflow.com/questions/73914582
复制相似问题