各运算符的运算优先级

时间:2021-08-21 14:42:02

     在一个设计遇到了一个这样的问题:

      假设 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