好久,没来这里写些什么了。这两个月一直忙着工作,今天忽然闲下来,想想把这两个月碰到的一些细节问题与大家共享下。好,老样子先看段代码:
在贴代码前,我先做个声明:代码在windows平台下运行。做UI的朋友经常用到DrawText()这个API,它里面有个参数是关于文字对齐方式的. 我们写控件输出信息时,都考虑增加这么类型的变量来控制文字信息输出,最典型的就是按钮。一般情况下,我们无需检测该变量,直接引用就好。但有时候为了让界面更人性化,我们需要检测该变量,并做些调整。好,现在看这段代码:
它根据对齐属性是否包含 DT_LEFT,而做一些工作
void OnPaint()
{
。。。。。。。
。。。。。。。
if( m_uAlign & DT_LEFT ) //代码 段 1
DoA();
else
DoB();
if( m_uAlign & DT_LEFT == DT_LEFT ) //代码 段 2
DoA();
else
DoB();
if( (m_uAlign & DT_LEFT ) == DT_LEFT ) //代码 段 3
DoA();
else
DoB();
。。。。。。。
}
上面三个代码段的执行过程为:1:永远执行 DoB() 函数体;
2:如果 m_uAlign 最末位是零 ,则执行 DoB()函数体; 否则则执行 DoA()函数体;
3:只要 m_uAlign 包含 标志位 DT_LEFT ,则执行 DoA()函数体; 其他则执行 DoB()函数体;
貌似,1和2 都不是我们想要的。只有3是正确的。造成这种现象的原因是什么?
1: 这个不容易查出来,我们一贯的写法都这样怎么会不对呢? 其实,我们看看他的定义就知道了 #define DT_LEFT 0x00000000
呵呵,缘由出来了;
2 :有了1 ,2 就更简单了,就是运算符优先级的问题;
3;正确;它演示了良好的代码风格;
总结,其实这不算大问题,都是细节上的问题。可是细节上的问题,往往是最不容易察觉的,就算你发现问题,可是想对代码段的定位更是困难,他们是隐形的虫子。为此,我们有必要养成良好的代码书写习惯和风格。对今天遇到的问题,我总结两条:
a) 在进行位标志检测时,一定要将检测结果与原值比较;
b) 在你不确定运算符的优先级时,请一定要用括号括起来;
今天,就写道这里。希望这两条对大家有帮助。以后碰到类似问题,能想到就好!