验证工程师经常犯的错误(2) --- 运算符优先级

106 阅读1分钟

前言:

芯片验证不仅是一个良心活,也是一个细心活。做一个项目,写代码的时间,远远赶不上调试的时间。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。

3