作为程序猿,一直就是在不断的填坑和不断的挖坑中度过的。你填过哪些前辈们挖过的坑?你又挖过哪些坑?
前两天我就遇到了一个资深前辈挖的坑,定位了两三个小时才找到问题所在。
代码想要实现的功能是这样的,如果A的第1位为1则进入if条件,代码是这样子的:
if(1 == A&0x01)
{
....
}
这个代码有什么问题?看起来没有毛病啊,可是怎么也进不了if语句,抓狂!!难道是我眼花了,难道是系统有问题,这么简单的一行代码,都要搞得怀疑人生了。
没办法,只好先打印A的值试试。什么!不是等于1是等于2,对哦,第1位为1,当然是等于2咯。于是代码改成:
if(2 == A&0x02)
{
....
}
哈哈,这下终于被我解决了吧,没毛病!
What!还是进步了if判断语句中。聪明的你知道为什么了吗?
没错,这么简单语句里只存在优先级的问题了,一查优先级表格,==的优先级高于位与&,这么多年白学了,在大部分的印象里,位与“&”的优先级很高,==的优先级很低,然而这么一个自以为是的以为,就白白浪费了一个下午的时间。大概是因为取地址“&”的优先级很高,所以大家就对“&”的印象停留在高优先级的概念里,然而此“&”非彼“&”。
如果养成好习惯给判断的右边不管认为优先级高还是低都通通加上等号,那么就不会再给自己给别人挖坑了。
因此,在任何超过二元的运算中,都要加(),避免出现简单又难查的问题。K&D的经典书里面就提过这个,但实践起来总会有人忘记。切记切记!