- Jika Anda mengeksekusi
SELECT -100/-100*10
hasilnya adalah0
. - Jika Anda mengeksekusi
SELECT (-100/-100)*10
hasilnya adalah10
. - Jika Anda mengeksekusi
SELECT -100/(-100*10)
hasilnya adalah0
. - Jika Anda mengeksekusi
SELECT 100/100*10
hasilnya adalah10
.
BOL menyatakan:
Jika dua operator dalam ekspresi memiliki tingkat prioritas operator yang sama, mereka dievaluasi dari kiri ke kanan berdasarkan posisinya dalam ekspresi.
Dan
Level Operators
1 ~ (Bitwise NOT)
2 * (Multiplication), / (Division), % (Modulus)
3 + (Positive), - (Negative), + (Addition), + (Concatenation), - (Subtraction), & (Bitwise AND), ^ (Bitwise Exclusive OR), | (Bitwise OR)
Apakah BOL salah, atau saya melewatkan sesuatu? Tampaknya -
membuang prioritas (diharapkan).
sql
sql-server
tsql
operator-precedence
cuizizhe
sumber
sumber
-
tampaknya menyebabkan aliran menjadi "salah". Jika Anda mencoba,-100/(-100)*10
Anda mendapatkan hasilnya10
. tampaknya nilai/
tersebut diterapkan terhadap nilai-
dalam persamaan dan kemudian persamaan100*10
tersebut ditentukan. Saya tidak yakin ini adalah kesalahan dengan BOL, tetapi lebih dari itu SQL Server tidak berfungsi seperti yang diharapkan. Mungkin ada baiknya mengangkat masalah di sql-docs dan melihat apa tanggapan mereka di sana; mungkin sebuah catatan bisa ditambahkan ke dokumentasi yang menasihati "fitur".SELECT -100/(-100)*10
juga mengembalikan 10. Sepertinya-
diperlakukan sebagai-
operator yang harus diterapkan hanya setelah100*10
dihitungA / -B * C
adalahA <div> <negate> B <multiply> C
. Negasi memiliki prioritas yang lebih rendah daripada kalikan, sesuai dokumen, jadi hasilnya adalahA / -(B * C)
. Anda dapat melihat ini lebih jelas dengan menggunakan konstanta mengambang:12e / -13e * 14e
vs.12e / (-13e) * 14e
vs.12e / 13e * 14e
Alasan ini membuat kita bingung adalah karena kita umumnya mengharapkan minus unary menjadi bagian dari literal, atau setidaknya memiliki prioritas yang sangat tinggi, tetapi itu bukan cara T-SQL bekerja.Jawaban:
Menurut tabel prioritas, ini adalah perilaku yang diharapkan. Operator dengan prioritas lebih tinggi (
/
dan*
) dievaluasi sebelum operator dengan prioritas lebih rendah (unary-
). Jadi ini:dievaluasi sebagai:
Perhatikan bahwa perilaku ini berbeda dari kebanyakan bahasa pemrograman di mana negasi unary memiliki prioritas lebih tinggi daripada perkalian dan pembagian misalnya VB , JavaScript .
sumber
-
dianggap sebagai operator di-100
. Dalam beberapa bahasa, ini adalah bagian dari sintaks integer.-
.BOL benar.
-
memiliki prioritas lebih rendah dari*
, jadidiuraikan sebagai
Perkalian apa adanya, Anda biasanya tidak memperhatikan hal ini, kecuali saat menggabungkan dua operator biner lain dengan prioritas yang sama:
/
dan%
(dan%
jarang digunakan dalam ekspresi gabungan seperti ini). BegituDiurai sebagai
menjelaskan hasil. Ini kontra-intuitif karena di sebagian besar bahasa lain, unary minus memiliki prioritas lebih tinggi daripada
*
dan/
, tetapi tidak di T-SQL, dan ini didokumentasikan dengan benar.Cara yang bagus (?) Untuk mengilustrasikannya:
menghasilkan luapan aritmatika, karena
-(1073741824 * 2)
menghasilkan2147483648
sebagai perantara, yang tidak sesuai denganINT
, tetapimenghasilkan hasil yang diharapkan
-2147483648
, yang tidak.sumber
-
adalah "negatif". Orang yang mengatakan hal-hal seperti "minus 10" padahal yang mereka maksud adalah "negatif 10" menjadi tidak tepat.-
operator, bila diterapkan pada operan tunggal, disebutMINUS
dalam rencana query SQL. Mitra binernya disebutSUB
. Jika Anda suka, tafsirkan "unary minus" sebagai singkatan untuk "operator unary yang ditandai dengan tanda minus" - sintaksis daripada sebutan semantik.Perhatikan dalam dokumentasi bahwa (mungkin berlawanan secara intuitif) urutan prioritas
- (Negative)
adalah ketiga.Jadi Anda secara efektif mendapatkan:
-(100/-(100*10)) = 0
Jika Anda menempatkannya ke dalam variabel, Anda tidak akan melihat ini terjadi, karena tidak ada operasi unary yang terjadi setelah perkalian.
Jadi di sini A dan B adalah sama, sedangkan C, D, E menunjukkan hasil yang Anda lihat (dengan E memiliki bracketing lengkap)
sumber