在一个设计遇到了一个这样的问题:
假设 S = 40, B = 220, D = 1280, 那么想在一个计数器计数到 S+B 之前 Y = 0; 在S+B 到 S+B+(D的一半)的之间 Y = 1, 在 S+B+(D的一半)到 S+B+D 之间 Y = 2; 再之后就是Y = 0;
于是这样写道: if(cnt < S+B ) Y = 0;
else if(cnt < S + B + D >>1 ) Y = 1 ; // 0< cnt < 900
else if(cnt < S + B + D) Y = 2; //900< cnt <1540
else Y = 0;
然后 在板子上运行就发现不正常 ,最后查得 在 cnt = 770 的时候 Y值就变为2了,与预想的不符,怎么会这样?
对比发现770 = 1540/2 ,难道在第二行 是在 S+B+D之和右移而不是 D右移之后再相加的 ?
这就是运算符号的运算优先级的问题了,查资料,得到一个下面的表:
果然是优先级的问题,忘记考虑了。
根据优先级可以得到下面的公式;
cnt = S +B+D >>1 = 770;
cnt = S +B+(D >>1) = 900;
cnt = S +B+D/2 = 900; (乘除优先级高于加减)
所以:
复杂运算可以分解为多个单式 。
复杂运算式可以 加括号 来确保优先级。
http://www.cnblogs.com/fhyfhy/p/5522549.html