标题:关于#define swap(a,b)交换函数求助
只看楼主
zhang12247
Rank: 1
等 级:新手上路
帖 子:7
专家分:2
注 册:2013-9-3
结帖率:100%
已结贴  问题点数:20 回复次数:6 
关于#define swap(a,b)交换函数求助
#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了
搜索更多相关主题的帖子: include system return count 
2013-09-03 16:44
yuccn
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:何方
等 级:版主
威 望:167
帖 子:6809
专家分:42393
注 册:2010-12-16
得分:20 
swap(a[i],a[size-1]); // 问题就在这,和下面一行的配合使用
#define swap(a,b) {a=a+b;b=a-b;a=a-b;}

红色的那个,为什么这样写呢?
i = 1的时候,而size 一直都等于2
这个时候就是swap(a[1],a[1]);

加上你的那个define
#define swap(a,b) {a=a+b;b=a-b;a=a-b;}
也就是:a[1] = a[1] + a[1];a[1] = a[1] - a[1];a[1] = a[1] - a[1];

注意绿色的,也就是把a[1]清零了。

我行我乐
我的博客:
http://blog.yuccn. net
2013-09-03 17:14
zhang12247
Rank: 1
等 级:新手上路
帖 子:7
专家分:2
注 册:2013-9-3
得分:0 
回复 2楼 yuccn
swap起到的就是交换作用。
假设a[1]的值是2的话,那么swap(a[1],a[1])=swap(2,2)
那么a=a+b就应该是a=2+2=4;
b=a-b就应该是b=4-2=2;
a=a-b就应该是a=4-2=2;
所以结果应该还是(2,2)只不过是已经换了位置了。不应该会变成0啊。难道我这么理解有问题?
2013-09-03 17:25
zhang12247
Rank: 1
等 级:新手上路
帖 子:7
专家分:2
注 册:2013-9-3
得分:0 
回复 2楼 yuccn
二楼你这绿色部分的a其实应该已经不是a[1]了,a应该已经是a[1]+a[1]了。
所以这时候a=a-b就应该等于(a[1]+a[1])-a[1]=a[1]。
2013-09-03 17:28
yuccn
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:何方
等 级:版主
威 望:167
帖 子:6809
专家分:42393
注 册:2010-12-16
得分:0 
你调试一下咯,不过最好不要弄个递归,不明白你的那个递归是干什么用的

我行我乐
我的博客:
http://blog.yuccn. net
2013-09-03 17:31
zhang12247
Rank: 1
等 级:新手上路
帖 子:7
专家分:2
注 册:2013-9-3
得分:0 
主要是我对递归不是很熟练,所以想练习下递归
2013-09-03 17:32
jg658237
Rank: 7Rank: 7Rank: 7
来 自:青藏高原
等 级:黑侠
帖 子:224
专家分:529
注 册:2013-8-8
得分:0 
同意二楼

武功再高也怕菜刀.
2013-09-03 17:46



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-420039-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.260240 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved