- Se você executar
SELECT -100/-100*10o resultado é0. - Se você executar
SELECT (-100/-100)*10o resultado é10. - Se você executar
SELECT -100/(-100*10)o resultado é0. - Se você executar
SELECT 100/100*10o 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)*10obterá o resultado 10. parece que o /está sendo aplicado contra o valor -na equação e então a equação 100*10está 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)*10também retorna 10. Parece que -é tratado como o -operador que deve ser aplicado somente após 100*10ser 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 * 14evs. 12e / (-13e) * 14evs. 12e / 13e * 14eO 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.