Windows 系统常变量 赋值的一个规则 位与 加运算 异同

来源:互联网 发布:java线程池并发 编辑:程序博客网 时间:2024/06/09 17:36

经常会有学弟问我,在API编程的时候,很多时候windows.h里或者其他库里的常数系统变量的“ 位或 |”运算和 “算术运算 +”是没有区别的。而我们知道 | 和+还是有区别的。

比如 MessageBox(NULL,"``","caption",MB_OK+MB_ICONERROR);

   和 MessageBox(NULL,"``","caption",MB_OK | MB_ICONERROR);

都是正确的。

GetWindowLong(Handle,GWL_EXSTYLE)|WS_EX_LAYERED

写成

GetWindowLong(Handle,GWL_EXSTYLE)+WS_EX_LAYERED

也是正确的。

 

这是因为M$在命名常数变量是是按二进制位赋值的。

比如举个例子,假如有个函数的某个形参的可能取值为16个。

一般我们的想法是指定整数0~15(十进制);

但是M$会这样指定:(16位二进制)

0000 0000 0000 0001

0000 0000 0000 0010

0000 0000 0000 0100

0000 0000 0000 1000

...

...

1000 0000 0000 0000

 

这样指定的好处就是,|和+运算都一样。给人一种组合感。

基于这样的基础上,还会有其他常量的定义。比如,你形参是:

1000 0000 0000 0001(二进制)

那么系统马上会知道,既含有0000 0000 0000 0001属性。

又含有1000 0000 0000 0000属性了。

这给编程记忆带来了不少好处。