- Si ejecuta
SELECT -100/-100*10
el resultado es0
. - Si ejecuta
SELECT (-100/-100)*10
el resultado es10
. - Si ejecuta
SELECT -100/(-100*10)
el resultado es0
. - Si ejecuta
SELECT 100/100*10
el resultado es10
.
BOL declara:
Cuando dos operadores de una expresión tienen el mismo nivel de precedencia de operadores, se evalúan de izquierda a derecha según su posición en la expresión.
Y
Level Operators
1 ~ (Bitwise NOT)
2 * (Multiplication), / (Division), % (Modulus)
3 + (Positive), - (Negative), + (Addition), + (Concatenation), - (Subtraction), & (Bitwise AND), ^ (Bitwise Exclusive OR), | (Bitwise OR)
¿BOL está mal o me falta algo? Parece que -
está descartando la precedencia (esperada).
sql
sql-server
tsql
operator-precedence
cuizizhe
fuente
fuente
-
parece estar causando que el flujo "salga mal". Si lo intentas-100/(-100)*10
, obtienes el resultado10
. parece que/
se está aplicando el valor-
en la ecuación y luego100*10
se está determinando la ecuación . No estoy seguro de que esto sea un error con BOL, pero más que SQL Server no se está comportando como se esperaba. Podría valer la pena plantear un problema sobre sql-docs y ver cuál es su respuesta; tal vez podría agregarse una nota a la documentación informando sobre la "característica".SELECT -100/(-100)*10
también devuelve 10. Parece que-
se trata como el-
operador que debe aplicarse solo después de que100*10
se calculaA / -B * C
esA <div> <negate> B <multiply> C
. Negar tiene menor precedencia que multiplicar, según los documentos, por lo que el resultado esA / -(B * C)
. Puede ver esto más claramente usando constantes flotantes:12e / -13e * 14e
vs12e / (-13e) * 14e
vs.12e / 13e * 14e
La razón por la que esto nos desconcierta es porque generalmente esperamos que los menos unarios se conviertan en parte del literal, o al menos tengan una precedencia muy alta, pero no es así como T-SQL trabajos.Respuestas:
Según la tabla de precedencia, este es el comportamiento esperado. El operador con mayor precedencia (
/
y*
) se evalúa antes que el operador con menor precedencia (unario-
). Así que esto:se evalúa como:
Tenga en cuenta que este comportamiento es diferente de la mayoría de los lenguajes de programación donde la negación unaria tiene mayor precedencia que la multiplicación y la división, por ejemplo , VB , JavaScript .
fuente
-
se considera un operador en-100
. En algunos lenguajes, es parte de la sintaxis de un número entero.-
.BOL es correcto.
-
tiene menor precedencia que*
, entoncesse analiza como
Siendo la multiplicación lo que es, normalmente no se nota esto, excepto cuando se mezclan los otros dos operadores binarios con igual precedencia:
/
y%
(y%
rara vez se usa en expresiones compuestas como esta). EntoncesSe analiza como
explicando los resultados. Esto es contrario a la intuición porque en la mayoría de los otros lenguajes, unario menos tiene mayor precedencia que
*
y/
, pero no en T-SQL, y esto está documentado correctamente.Una buena (?) Forma de ilustrarlo:
produce un desbordamiento aritmético, porque
-(1073741824 * 2)
produce2147483648
como un intermedio, que no cabe en unINT
, peroproduce el resultado esperado
-2147483648
, que lo hace.fuente
-
es "negativo". Las personas que dicen cosas como "menos 10" cuando quieren decir "menos 10" están siendo imprecisas.-
operador, cuando se aplica a un solo operando, se llamaMINUS
en los planes de consulta SQL. Su contraparte binaria se llamaSUB
. Si lo desea, interprete "menos unario" como abreviatura de "el operador unario representado por el signo menos", una designación sintáctica en lugar de semántica.Observe en la documentación que (quizás de forma contraria a la intuición) el orden de precedencia de
- (Negative)
es tercero.Entonces efectivamente obtienes:
-(100/-(100*10)) = 0
Si los coloca en variables, no verá que esto suceda, ya que no hay una operación unaria que ocurra después de la multiplicación.
Entonces, aquí A y B son iguales, mientras que C, D, E muestran el resultado que está viendo (con E con el corchete completo)
fuente