程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 程序猿之---C語言細節9

程序猿之---C語言細節9

編輯:關於C語言

程序猿之---C語言細節9


主要內容:宏定義、max(a,b)宏定義細節、大小端判斷、(int&)a什麼意思

#if 1 
#include 

// 注意空格 
#define F (x) ((x) - 1)   // F代表後面
#define F(x) ((x) - 1)    // F(x)代表後面

#define T1 struct type*
T1 a,b;  // 使用上面在定義多個變量時達不到目的,被解析為struct type* a,b;  a為指向結構體的指針,而b被定義為一個結構體 
 // 經典的筆試題宏定義求最大值
//#define max(a,b) a>b?a:b          //這個很容易錯,下面的比較不容易錯,但是也會有錯的時候 
#define max(a,b) ((a)>(b)?(a):(b))     // 寫成這樣得不到滿分,仍然可能會出現問題,解釋如下 
                                       // 同時這個宏定義也沒有考慮傳入不同類型的參數情況,
									   									   
 /*  
  *   如果一個操作數在兩處被用到,就會被求值兩次;
  *   表達式max(a,b)中如果帶有副作用,在比較大小時會計算一次,在後面計算值時也會計算一次 
  *   錯誤例子如下 : 
  */
int main(int argc, char** argv)
{
    int x[3] = {2,3,1};
    int biggest = x[0];
    int i = 1;
    
    while(i < 3)
    {
    	biggest = max(biggest, x[i++]);  // 被拆解為biggest > x[i++]?biggest:x[i++],(biggest=2)<(x[1]=3)
										 //  關鍵點在於i在比較大小時有副作用,i++在後時i已經加1,biggest=x[2] 
    }                                    // 解決方法是確定參數中沒有副作用,或則直接編寫max函數 
    printf("biggest is %d\n",biggest);
    
//    一種考慮傳入不同變量類型的max宏定義
//比較正確的答案應為:
#define MAX(a,b) ({ \
           const typeof(a) _a = a; \
           const typeof(b) _b = b; \
           (void)(&_a == &_b); \  
           _a > _b ? _a : _b;}) 
	return 0;
}

// 下面是測試大小端的方法 ,已經使用#if #elif  需要自己打開相應開關 
// 補充一個 (int&)a是什麼意思 ?(int&)a就是*(int*)(&a) 
#elif 1 
 
#include

int main()
{
    int x = 1;
    char *p = (char *)&x;

    if(*p)
    {
        printf("little\n");
    }
    else
    {
        printf("large\n");
    }
    return 0;
}


#else 

#include 

int main()
{
    short int x;
    char x1,x2;
    x = 0x1122;
    x1 = ((char *)&x)[0];    //低地址
    x2 = ((char *)&x)[1];    //高地址
    printf("x1=%x\n",x1);
    printf("x2=%x\n",x2);
    return 0;
}

#endif 

輸出:

宏定義和大小端

\


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