- Если выполнить,
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 неправильный, или я что-то упускаю? Кажется, -
это отбрасывает (ожидаемый) приоритет.
sql
sql-server
tsql
operator-precedence
Cuizizhe
источник
источник
-
, кажется, приводит к тому, что поток идет «неправильно». Если попробуешь-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 не так. работает.Ответы:
В соответствии с таблицей приоритета, это является ожидаемым поведением. Оператор с более высоким приоритетом (
/
и*
) оценивается перед оператором с более низким приоритетом (унарный-
). Итак, это:оценивается как:
Обратите внимание, что это поведение отличается от большинства языков программирования, где унарное отрицание имеет более высокий приоритет, чем умножение и деление, например, VB , JavaScript .
источник
-
, считается ли оператор в-100
. В некоторых языках это часть синтаксиса целого числа.-
.BOL правильный.
-
имеет более низкий приоритет, чем*
, поэтомуразбирается как
Умножение является тем, чем оно является, вы обычно этого не замечаете, за исключением смешивания двух других двоичных операторов с равным приоритетом:
/
и%
(и%
редко используется в составных выражениях, подобных этому). ТакАнализируется как
объясняя результаты. Это нелогично, потому что в большинстве других языков унарный минус имеет более высокий приоритет, чем
*
и/
, но не в T-SQL, и это правильно задокументировано.Хороший (?) Способ проиллюстрировать это:
производит арифметическое переполнение, потому что
-(1073741824 * 2)
производит2147483648
как промежуточное звено, которое не помещается вINT
, нодает ожидаемый результат
-2147483648
, что и происходит.источник
-
- это «отрицательный». Люди, которые говорят что-то вроде «минус 10», имея в виду «отрицательные 10», ошибаются.-
Оператор, при применении к одним операндом, вызываетсяMINUS
в планах запросов SQL. Его двоичный аналог называетсяSUB
. Если хотите, интерпретируйте «унарный минус» как сокращение для «унарного оператора, обозначенного знаком минус» - синтаксическое, а не семантическое обозначение.Обратите внимание в документации, что (возможно, что противоречит интуиции) порядок приоритета для
- (Negative)
третьего.Таким образом вы получите:
-(100/-(100*10)) = 0
Если вы поместите их в переменные, вы этого не увидите, так как после умножения не происходит унарных операций.
Итак, здесь A и B одинаковы, тогда как C, D, E показывают результат, который вы видите (с E, имеющим полный брекетинг)
источник