Do What You think !!

 

代码书写细节

好久,没来这里写些什么了。这两个月一直忙着工作,今天忽然闲下来,想想把这两个月碰到的一些细节问题与大家共享下。好,老样子先看段代码:
在贴代码前,我先做个声明:代码在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) 在你不确定运算符的优先级时,请一定要用括号括起来;
今天,就写道这里。希望这两条对大家有帮助。以后碰到类似问题,能想到就好!

posted on 2007-08-28 20:36 零宇 阅读(470) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理


导航

统计

常用链接

留言簿(4)

随笔档案(8)

文章分类(4)

文章档案(4)

Windows Mobile 论坛

道中人

最新随笔

搜索

积分与排名

最新评论

阅读排行榜

评论排行榜