前言:
芯片验证不仅是一个良心活,也是一个细心活。做一个项目,写代码的时间,远远赶不上调试的时间。Q哥最抓狂的就是被一个菜鸟的错误耽误半天工夫。
今天就跟大家来聊一聊运算符的优先级问题,下面所有的错误都是Q哥曾经犯过的,说多了都是泪啊。。。
1 移位运算与算术运算
Q哥最开始写代码的时候,还是按照数学上从左到右的思维来运算,所以把a左移1位再加b,误写成了 xyz = a << 1 + b; 还特意加了空格想区分开来。
殊不知这样实际等效于 xyz = a << (1+b) ; 而且,加空格完全不能改变优先级,新手一定要明白这一点! 正确的写法应该是 xyz = (a << 1) + b;。
2 位运算(& | ^)和比较运算(== !=)
如果是if(a+b == c), 那么+的优先级高于==,所以等效于if((a+b) == c)。
但是Q哥在修改代码的时候,只是把+改成^,忘了加括号,变成if(a&b == c)。
由于&的优先级低于==,所以等效于if(a&(b==c)),与原本的期望不符,从而引入了bug。