define[宏定義] 的小問題

這裏說一下define在使用時用出現的一些問題,是我在寫題的時候遇到的。
一般情況下都是使用define定義的常數,比如說

#define inf 999999999
#define INF 0x3f3f3f
const int inf=99999999;

當然這裏不如const 定義的時候更嚴密,因爲const說明了變量的類型。

還有就是我們利用define函數的時候,也就是帶參數的宏。比如#define max(a,b) a>b?a:b 就十分容易出現錯誤的包括機器和人理解上的錯誤。所以我們在使用的時候儘量在每一層次的時候都加一個擴號避免錯誤帶來的麻煩。
#define Add(a,b) a+b.
c * Add(a,b) * d
得應該是c*(a+b)*d, 然而機器讀的時候就是c*a+b*d.

我的理解就是說define 宏定義的函數這裏的”(“和”)”不再是優先級運算符了。不能再代表小括號的。其他的可以看看下面代碼的具體實例,自己寫一下的,加深一下自己的理解。

#include <stdio.h>
#include <stdlib.h>
#define ADD(x) x+x
#define add(x) (x)+(x)
#define MAX(a,b) a>b?a:b
#define max(a,b) ((a)>(b)?(a):(b))

int main()
{
    int m=7,n=2,k=100;

    int ans0=ADD(n+m)*k;        //n+m+n+m*k=2+7+2+7*100
    int ans1=ADD(m+n)*k;        //m+n+m+n*k=7+2+7+2*100
    int ans2=add(n+m)*k;        //n+m+(n+m)*k
    int ans3=add(m+n)*k;        //m+n+(m+n)*k
    int ans4=(add(m+n))*k;      //(m+n)*2*k
    printf("ans0 = %d\n",ans0);     // ans0 = 711 ;
    printf("ans1 = %d\n",ans1);     // ans1 = 216 ;
    printf("ans2 = %d\n",ans2);     // ans2 = 909 ;
    printf("ans3 = %d\n",ans3);     // ans3 = 909 ;
    printf("ans4 = %d\n",ans4);     // ans4 = 1800 ;

    int max0=MAX(n,m)+k;        //n>m?n:m+k     n>m顯示n,否則顯示m+k 
    int max1=MAX(m,n)+k;        //m>n?m:n+k     
    int max2=max(n,m)+k;        //max(n,m)+k
    int max3=max(m,n)+k;        //max(n,m)+k
    int max4=(max(m,n))+k;
    printf("max0 = %d\n",max0);     // max0 = 107 ;
    printf("max1 = %d\n",max1);     // max1 = 7 ;
    printf("max2 = %d\n",max2);     // max2 = 107 ;
    printf("max3 = %d\n",max3);     // max3 = 107 ;
    printf("max4 = %d\n",max4);     // ans3 = 107 ;
    //system("pause");
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章