- Se você executar
SELECT -100/-100*10
o resultado é0
. - Se você executar
SELECT (-100/-100)*10
o resultado é10
. - Se você executar
SELECT -100/(-100*10)
o resultado é0
. - Se você executar
SELECT 100/100*10
o resultado é10
.
BOL declara:
Quando dois operadores em uma expressão têm o mesmo nível de precedência de operador, eles são avaliados da esquerda para a direita com base em sua posição na expressão.
E
Level Operators
1 ~ (Bitwise NOT)
2 * (Multiplication), / (Division), % (Modulus)
3 + (Positive), - (Negative), + (Addition), + (Concatenation), - (Subtraction), & (Bitwise AND), ^ (Bitwise Exclusive OR), | (Bitwise OR)
O BOL está errado ou estou faltando alguma coisa? Parece que o -
está jogando fora a precedência (esperada).
-
parece estar fazendo com que o fluxo saia "errado". Se você tentar, -100/(-100)*10
obterá o resultado 10
. parece que o /
está sendo aplicado contra o valor -
na equação e então a equação 100*10
está sendo determinada. Não tenho certeza se isso é um erro com o BOL, mas mais que o SQL Server não está se comportando conforme o esperado. Pode valer a pena levantar um problema em sql-docs e ver qual é a resposta deles; talvez uma nota possa ser adicionada à documentação avisando sobre o "recurso".
SELECT -100/(-100)*10
também retorna 10. Parece que -
é tratado como o -
operador que deve ser aplicado somente após 100*10
ser calculado
A / -B * C
é A <div> <negate> B <multiply> C
. Negar tem precedência menor do que multiplicar, de acordo com os documentos, então o resultado é A / -(B * C)
. Você pode ver isso mais claramente usando constantes flutuantes: 12e / -13e * 14e
vs. 12e / (-13e) * 14e
vs. 12e / 13e * 14e
O motivo pelo qual isso nos confunde é porque geralmente esperamos que o menos unário se torne parte do literal, ou pelo menos tenha uma precedência muito alta, mas não é assim que o T-SQL trabalho.