1.不用第三變數,交換兩個變數的方法:
a = a ^ b;
b = a ^ b;
a = a ^ b; //( a ^ b ) ^ a == b
或者
a = a + b;
b = a - b;
a = a - b;// (a + b) - a == b
(註:以上兩種方法不適應浮點型變數,表示方法和精度的原因)
2.計算一個變數裡‘1’的個數:
f(char x){
for(int i=0; x; x &= x-1,i++);
return i;
}
解釋:假設 x 為 11010100
x-1 為 11010011
x & (x -1)為 11010000 ,到這裡,我們發現結果不為零,且少了一個1。所以一次迴圈少個1,記錄迴圈次數就行了。
另外:一個數如果是2的n次冪,那麼他一定是1後加一些0,如1000, 1000000等。
那麼 x & (x - 1)的結果為零,那麼他就是2的n次冪。
3.讓函數宏像函數一樣使用
/*以下是宏定義*/
#define MACRO(c)\
do {\
if( c )\
{\
printf("hello!");
}\
}while(0) //do-while語句while()後應有一個“;”,這裡有意捨去且條件永遠為假,即內部語句只能執行一遍
/*以下是宏使用*/
MACRO(1);//此處的“;”看上去像語句末尾的分號,其實它是宏定義末尾捨去的分號,這樣的do-while宏使用起來就像函數了
4.不用 if 的類 if 語句
(void)(DLL_Exit == DLL_ZERO_INFO && fputs("Size of address record is zero.\n\n", stderr));
利用“&&”運算子的短路原理,前邊運算式的值能夠決定後邊的能否執行到。
5.花括弧可以使宏得到傳回值
會返回最後一條語句的賦值結果
#define even(x)\
({\
int y = x;\
(2*(y/2) == y ? y:y+1);\
})
http://topic.csdn.net/u/20091126/20/e05094ad-448e-41a6-a199-f3ca93d40c43.html?seed=222192752&r=79877196#r_79877196
另一說,花括弧是為了替換do{}while(0)語句,使宏使用後能加“;”。
猜想,花括弧所代表的語句塊的值就是花括弧內最後一條語句的值。(待驗證)
6. 函數型宏定義傳回值
#include
<stdio.h>
#define
even(x, ret)\
{\
int
y = x;\
ret
= (2*(y/2)
== y
? y:y+1);\
}
int main(void)
{
int
ret;
int
num =
10;
even(num, ret);
printf("num
= %d\n", ret);
num++;
even(num, ret);
printf("num
= %d\n", ret);
return
0;
}