C语言--运算符优先级

来源:岁月联盟 编辑:exp 时间:2012-09-12

对于不确定性问题,要想办法去确认,否则等待你的将会是Bug-----编程心得

上个月在南京为项目中增加一个控制监视模块的时候,草草地写完了代码,代码中有一句是这样的:
[cpp] 
if (indicator & 0x8000 == 0x8000) { 
            do something 

 这里,indicator是int型。我的意思是,如果indicator的第16位是1,那么就执行括号里的语句,即indicator的第16位是一个标志位。写代码的时候,我是那么想的,写完之后很多天我也是那么想的。可是在南京的哥们却跟我说,程序运行并不对。如是我自己再去看代码,仍然发觉没有什么问题。但多次的实践告诉我,计算机是不会随便冤枉一个程序媛的。既然程序不对,那么Bug是千真万确地存在。经过各方排查,我把焦点转移集中到了下面这句
[cpp] 
task.cur = indicator & 0x7fff; 
这句的意图是将indicator中的标志位去掉,恢复出正确的数值。前面说到indicator是int型的,也就是32的;而0x7fff是16的。所以我很自然地以为这里计算可能错了。看到这里,各位高手可能要笑了,“你丫基础还真茶经!”。哈哈,事后我也笑了。没办法,当找不到元凶的时候,替罪羊是减轻心理压力的一个好方法。其实,这里的计算并不会导致错误,因为C有类型提升。不过虽然如此,我也还是想知道,编译器在编译0x7fff这样的常量的时候是怎样处理的。
好,接下来为替罪羊伸张正义,那么就需要把那个元凶给揪出来了。事情的真相是,“关系运算符的优先级要高于逻辑运算符”。对于运算符优先级的问题,每次看C语言编程方面的书籍的时候,我总会跳过去,太麻烦了。而我很讨厌记那些麻烦的东西,所以这变成了我的编程不确定性问题。但是,知道总是好的。不过,我仍然不会去记,我只会给自己留下一个意识。以后碰到这样的问题,我一律会有括号去解决。所以这句,就算我不知道优先级,我也会这样写:
[cpp] 
if ((indicator & 0x8000) == 0x8000) { 
            do something 

图片内容