一些C语言算法和技巧


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;

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值