- Если выполнить,
SELECT -100/-100*10
результат будет0
. - Если выполнить,
SELECT (-100/-100)*10
результат будет10
. - Если выполнить,
SELECT -100/(-100*10)
результат будет0
. - Если выполнить,
SELECT 100/100*10
результат будет10
.
BOL заявляет:
Если два оператора в выражении имеют одинаковый уровень приоритета, они оцениваются слева направо в зависимости от их положения в выражении.
И
Level Operators
1 ~ (Bitwise NOT)
2 * (Multiplication), / (Division), % (Modulus)
3 + (Positive), - (Negative), + (Addition), + (Concatenation), - (Subtraction), & (Bitwise AND), ^ (Bitwise Exclusive OR), | (Bitwise OR)
BOL неправильный, или я что-то упускаю? Кажется, -
это отбрасывает (ожидаемый) приоритет.
-
, кажется, приводит к тому, что поток идет «неправильно». Если попробуешь -100/(-100)*10
, получишь результат 10
. кажется, /
что применяется против значения -
в уравнении, а затем уравнение 100*10
определяется. Я не уверен, что это ошибка BOL, но более того, SQL Server ведет себя не так, как ожидалось. Возможно, стоит поднять вопрос о sql-docs и посмотреть, какой там ответ; возможно, можно было бы добавить в документацию примечание, сообщающее об этой «особенности».
SELECT -100/(-100)*10
также возвращает 10. Похоже, -
он рассматривается как -
оператор, который следует применять только после 100*10
вычисления
A / -B * C
есть A <div> <negate> B <multiply> C
. Согласно документации, отрицание имеет более низкий приоритет, чем умножение, поэтому результат такой A / -(B * C)
. Вы можете увидеть это более четко, используя плавающие константы: 12e / -13e * 14e
vs. 12e / (-13e) * 14e
vs. 12e / 13e * 14e
Причина, по которой это нас сбивает, заключается в том, что мы обычно ожидаем, что унарный минус станет частью литерала или, по крайней мере, будет иметь очень высокий приоритет, но T-SQL не так. работает.