程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 關於C語言中define swap(a,b) {a=a+b;b=a-b;a=a-b;}和#define swap(a,b

關於C語言中define swap(a,b) {a=a+b;b=a-b;a=a-b;}和#define swap(a,b

編輯:關於C語言

練習數字全排列時發現出現這種問題:

#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.造成交換不成功。

所以提醒,當涉及數組交換時,最好還是使用第二種比較穩妥些。因為或許在交換數組時出現,傳入參數為同一個數組值。


本文出自 “實踐心得” 博客,請務必保留此出處http://zhangjiabin.blog.51cto.com/2325830/1288273

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved