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);\
})
另一说,花括号是为了替换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;
}
一些C语言算法和技巧
最新推荐文章于 2024-04-23 22:44:16 发布