练习数字全排列时发现出现这种问题:
#include <stdio.h> #include <stdlib.h> //#define swap(a,b) {a=a+b;b=a-b;a=a-b;} #define swap(a,b) {tmp=a;a=b;b=tmp;} int g_count=1; int g_n=0; void p(int *a,int size); void print_result(int *a); int main(int argc, char *argv[]) { int array[]={1,2}; g_n=sizeof(array)/sizeof(int); p(array,g_n); system("PAUSE"); return 0; } void print_result(int *a) { int i=0; printf("count %d:",g_count++); //printf("g_n=%d",g_n); for(i=0;i<g_n;i++) { printf(" %d",a[i]); } printf("\n"); return; } void p(int *a,int size) { if(size==1) { print_result(a); } else { int i,tmp=0; for(i=0;i<size;i++) { //printf("before1:a%d=%d,a%d=%d\n",i,a[i],size-1,a[size-1]); swap(a[i],a[size-1]); //printf("before2:a%d=%d,a%d=%d\n",i,a[i],size-1,a[size-1]); p(a,size-1); swap(a[i],a[size-1]); //printf("after:a%d=%d,a%d=%d\n",i,a[i],size-1,a[size-1]); } } return; }
以上代码实现的是数字全排列,但是使用define swap(a,b) {a=a+b;b=a-b;a=a-b;}和#define swap(a,b) {tmp=a;a=b;b=tmp;}得出的是不同的结果。难道是编译器的问题吗?编译器是dev c++的。前者结果是2,1和1,2。后者结果就是2,1和1,0了
结论:调试后发现,当传入参数是同一个参数时,swap传入参数为(a[1],a[1])时,当执行define swap(a,b) {a=a+b;b=a-b;a=a-b;} 假设a[1]的值为2,则或许会认为执行第一步a=a+b时,a=4,b=2。但是调试后发觉由于传入参数是同一个变量,所以此时a=4时,b的值也同样变成了4.造成交换不成功。
所以提醒,当涉及数组交换时,最好还是使用第二种比较稳妥些。因为或许在交换数组时出现,传入参数为同一个数组值。