经常会有学弟问我,在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属性了。
这给编程记忆带来了不少好处。