- Se esegui
SELECT -100/-100*10
il risultato è0
. - Se esegui
SELECT (-100/-100)*10
il risultato è10
. - Se esegui
SELECT -100/(-100*10)
il risultato è0
. - Se esegui
SELECT 100/100*10
il risultato è10
.
BOL afferma:
Quando due operatori in un'espressione hanno lo stesso livello di precedenza degli operatori, vengono valutati da sinistra a destra in base alla loro posizione nell'espressione.
E
Level Operators
1 ~ (Bitwise NOT)
2 * (Multiplication), / (Division), % (Modulus)
3 + (Positive), - (Negative), + (Addition), + (Concatenation), - (Subtraction), & (Bitwise AND), ^ (Bitwise Exclusive OR), | (Bitwise OR)
BOL ha torto o mi sto perdendo qualcosa? Sembra che -
stia eliminando la (attesa) precedenza.
-
sembra che questo stia facendo andare "storto" il flusso. Se ci provi -100/(-100)*10
ottieni il risultato 10
. sembra che /
si stia applicando il contro al valore -
nell'equazione e poi l'equazione 100*10
venga determinata. Non sono sicuro che questo sia un errore con BOL, ma soprattutto SQL Server non si comporta come previsto. Potrebbe valere la pena sollevare un problema su sql-docs e vedere quale sia la loro risposta; forse una nota potrebbe essere aggiunta alla documentazione che consiglia la "funzionalità".
SELECT -100/(-100)*10
restituisce anche 10. Sembra che -
sia trattato come l' -
operatore che dovrebbe essere applicato solo dopo 100*10
essere stato calcolato
A / -B * C
è A <div> <negate> B <multiply> C
. Negate ha una precedenza inferiore rispetto a moltiplicare, per i documenti, quindi il risultato è A / -(B * C)
. Puoi vederlo più chiaramente usando costanti fluttuanti: 12e / -13e * 14e
vs 12e / (-13e) * 14e
vs. 12e / 13e * 14e
Il motivo per cui questo ci sconcerta è perché generalmente ci aspettiamo che il meno unario diventi parte del letterale, o almeno abbia una precedenza molto alta, ma non è così che T-SQL lavori.