cui*_*zhe 95 sql t-sql sql-server operator-precedence
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)
Run Code Online (Sandbox Code Playgroud)
BOL是错的,还是我错过了什么?似乎-
正在抛弃(预期)优先权.
Sal*_*n A 85
根据优先级表,这是预期的行为.具有较高优先级(/
和*
)的运算符在具有较低优先级(一元-
)的运算符之前进行求值.所以这:
-100 / -100 * 10
Run Code Online (Sandbox Code Playgroud)
被评估为:
-(100 / -(100 * 10))
Run Code Online (Sandbox Code Playgroud)
请注意,这种行为与大多数编程语言不同,其中一元否定的优先级高于乘法和除法,例如VB,JavaScript.
Jer*_*ert 30
BOL是对的.-
具有比优先级低*
,所以
-A * B
Run Code Online (Sandbox Code Playgroud)
被解析为
-(A * B)
Run Code Online (Sandbox Code Playgroud)
乘法就是这样,你通常不会注意到这一点,除非在另外两个具有相同优先级的二元运算符中混合:/
和%
(%
很少在像这样的复合表达式中使用).所以
C / -A * B
Run Code Online (Sandbox Code Playgroud)
被解析为
C / -(A * B)
Run Code Online (Sandbox Code Playgroud)
解释结果.这是违反直觉的,因为在大多数其他语言中,一元减号的优先级高于*
和/
,但在T-SQL中没有,这是正确记录的.
一个很好的(?)方式来说明它:
SELECT -1073741824 * 2
Run Code Online (Sandbox Code Playgroud)
产生算术溢出,因为-(1073741824 * 2)
产生2147483648
一个中间,不适合INT
,但是
SELECT (-1073741824) * 2
Run Code Online (Sandbox Code Playgroud)
产生预期的结果-2147483648
,这样做.
Jam*_*ard 10
在文档中注意(可能反直觉地)优先顺序为- (Negative)
第三.
所以你有效地得到:
-(100/-(100*10)) = 0
如果将它们放入变量中,您将看不到这种情况,因为在乘法后没有一元运算.
所以这里A和B是相同的,而C,D,E显示你看到的结果(E具有完整的包围)
DECLARE @i1 int, @i2 int, @i3 int;
SELECT @i1 = -100,
@i2 = -100,
@i3 = 10;
SELECT @i1/@i2*@i3 [A],
-100/(-100)*10 [B],
-100/-100*10 [C],
-100/-(100*10) [D],
-(100/-(100*10)) [E];
A - 10
B - 10
C - 0
D - 0
E - 0
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
6206 次 |
最近记录: |