在SQL SERVER 2005/2008里,都说比较运算符的优先级高于位异或(^)和位或(|)运算符,如果是这样,下面表达式的运算结果是什么呢?
                         3^5>5
如果>的级别高于^,那么应该先进行比较运算5>5,结果为false,然后进行3^false的运算导致由于类型不匹配而报错。但实际上上述表达式的运算结果为true,即先进行了3^5的运算,得到运算结果6,然后6>5得到true。
请问究竟是SQL Server的帮助里对运算符优先级的解释有问题,还是我的理解有问题。请各位大虾赐教!

解决方案 »

  1.   

    级别  运算符  
    1
     ~(位非)
     
    2
     *(乘)、/(除)、%(取模)
     
    3
     +(正)、-(负)、+(加)、(+连接)、-(减)、&(位与)、^(位异或)、|(位或)
     
    4
     =、>、<、>= 、<= 、<> 、!=, !> 、!<(比较运算符)
     
    5
     NOT
     
    6
     AND
     
    7
     ALL、ANY、BETWEEN、IN、LIKE、OR、SOME
     
    8
     =(赋值)
     
      

  2.   

    >的级别低于^,也就是先计算^,再计算>
      

  3.   

    运算符的优先顺序
    当一个复杂的表达式有多个运算符时,运算符优先性决定执行运算的先后次序。执行的顺序可能严重地影响所得到的值。运算符有下面这些优先等级。在较低等级的运算符之前先对较高等级的运算符进行求值。 +(正)、-(负)、~(按位 NOT)
    *(乘)、/(除)、%(模)
    +(加)、(+ 串联)、-(减)
    =,  >,  <,  >=,  <=,  <>,  !=,  !>,  !< 比较运算符
    ^(位异或)、&(位与)、|(位或)
    NOT
    AND
    ALL、ANY、BETWEEN、IN、LIKE、OR、SOME
    =(赋值) 
    当一个表达式中的两个运算符有相同的运算符优先等级时,基于它们在表达式中的位置来对其从左到右进行求值。
      

  4.   

    请问二楼,您的运算符优先级是从哪里的参考文献中获得的,我在SQL Server 2005/2008的Transact-SQL联机帮助里看到的都是比较运算符的优先级高于^和|运算符啊。
      

  5.   

    我觉得我发现了问题的答案,大家可以尝试访问以下两个不同的网址:
    第一个:http://msdn.microsoft.com/zh-cn/library/ms190276(v=SQL.90).aspx
    第二个:http://msdn.microsoft.com/zh-cn/library/ms190276.aspx
    前面一个是SQL Server 2005的联机帮助里关于运算符优先级的解释,后面一个是SQL Server 2008的联机帮助里关于运算符优先级的解释。两者的区别恰恰就是位异或(~)和位或(|)两个运算符的优先级发生了变化,2005帮助里将这两个运算符的优先级单独设为5级,而2008帮助里将它们的优先级设为了3级。
    不知道这两个是都对呢,还是确实2005帮助出了一些小问题,总之我在2005版本中测试的结果支持2008对于运算符优先级的解释。
    从网址上看,2005帮助的网址中多了"v=SQL.90",2008则没有,是不是与SQL 90标准有关呢,不得而知。总之,谢谢各位了!