【发布时间】:2014-10-22 18:49:12
【问题描述】:
C 编程新手,尝试创建一个交换两个变量值的 void 函数。当我希望交换两个整数变量的值时,以下函数可以正常工作,例如 a = 11, b = 33 和函数调用 swap(&a, &b):
void swap(int *a, int *b) {
*a += *b;
*b = *a - *b;
*a -= *b;
}
但是,当我尝试对数组的两个元素执行此操作时,例如 swap(&a[0], &a[2]) 无法正常工作。但是,它确实适用于以下功能:
void swap(int i, int j, int a[]) {
int h = a[i];
a[i] = a[j];
a[j] = h;
}
有谁知道为什么单变量的第一个工作,而不是数组元素?当然,我在这里缺少一个很好的解释。欢迎所有帮助,在此先感谢!
这是完整的程序:
#include <stdio.h>
#include <stdlib.h>
void swap(int *a, int *b) {
*a += *b;
*b = *a - *b;
*a -= *b;
}
void selectionSort(int a[], int len) {
int i, j, min;
for (i = 0; i < len; i++) {
min = i;
for (j = i+1; j < len; j++) {
if (a[j] < a[min]) {
min = j;
}
}
swap(&a[i], &a[min]);
}
}
int main(int argc, char * argv[]) {
int a[5] = {5, 4, 3, 2, 1};
int len = 5, i;
selectionSort(a, len);
for (i = 0; i < len; i++) {
printf("%d ", a[i]);
}
printf("\n");
return 0;
}
数组值的输出是 1 2 0 0。
【问题讨论】:
-
“它不能正常工作”是对问题的糟糕描述。
-
这可能是一个情境问题。如果由于某种原因,您的调用代码对自身执行元素交换( swap(&a[1], &a[1]); ),这将不予检查......我对该方法的初步理解表明它会设置无意中将值设为 0。也许这正在发生?
-
请注意,有一个更好的(更少的操作,没有由于溢出导致未定义行为的机会)交换两个变量而没有额外空间的方法:
*a ^= *b; *b ^= *a; *a ^= *b;在a == b时仍然不起作用。跨度> -
我推荐下面@DavidSchwartz 的答案。要自己解决这些问题,建议添加 printf 和/或使用调试器 :-)