Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server中的一个奇怪操作问题:-100/-100*10=0 如果执行选择-100/-100*10,结果是0 如果执行SELECT(-100/-100)*10,结果是10 如果执行选择-100/(-100*10)则结果为0 如果执行选择100/100*10,结果是10_Sql_Sql Server_Tsql_Operator Precedence - Fatal编程技术网

SQL Server中的一个奇怪操作问题:-100/-100*10=0 如果执行选择-100/-100*10,结果是0 如果执行SELECT(-100/-100)*10,结果是10 如果执行选择-100/(-100*10)则结果为0 如果执行选择100/100*10,结果是10

SQL Server中的一个奇怪操作问题:-100/-100*10=0 如果执行选择-100/-100*10,结果是0 如果执行SELECT(-100/-100)*10,结果是10 如果执行选择-100/(-100*10)则结果为0 如果执行选择100/100*10,结果是10,sql,sql-server,tsql,operator-precedence,Sql,Sql Server,Tsql,Operator Precedence,国家: 当表达式中的两个运算符具有相同的运算符优先级时,将根据它们在表达式中的位置从左到右计算它们 及 是BOL错了,还是我遗漏了什么?似乎-正在取消(预期的)优先级。根据优先级表,这是预期的行为。优先级较高的运算符(/和*)在优先级较低的运算符(一元-)之前求值。因此: -100 / -100 * 10 评估结果如下: -(100 / -(100 * 10)) 请注意,这种行为不同于大多数编程语言,在这些语言中,一元否定的优先级高于乘法和除法,例如。BOL是正确的-的优先级低于*,因此 -

国家:

当表达式中的两个运算符具有相同的运算符优先级时,将根据它们在表达式中的位置从左到右计算它们


是BOL错了,还是我遗漏了什么?似乎
-
正在取消(预期的)优先级。

根据优先级表,这是预期的行为。优先级较高的运算符(
/
*
)在优先级较低的运算符(一元
-
)之前求值。因此:

-100 / -100 * 10
评估结果如下:

-(100 / -(100 * 10))

请注意,这种行为不同于大多数编程语言,在这些语言中,一元否定的优先级高于乘法和除法,例如。

BOL是正确的<代码>-的优先级低于
*
,因此

-A * B
被解析为

-(A * B)
C / -(A * B)
乘法就是这样,你通常不会注意到这一点,除非在混合其他两个具有同等优先级的二进制运算符时:
/
%
(而
%
很少在这样的复合表达式中使用)。所以

被解析为

-(A * B)
C / -(A * B)
解释结果。这是违反直觉的,因为在大多数其他语言中,一元负号的优先级高于
*
/
,但在T-SQL中没有,并且这是正确记录的

一个很好的(?)说明方法:

SELECT -1073741824 * 2
产生算术溢出,因为
-(1073741824*2)
产生
2147483648
作为中间值,它不适合
INT
,但是

SELECT (-1073741824) * 2

生成预期结果
-2147483648
,确实如此。

请注意,文档中
-(负)
的优先顺序(可能与直觉相反)排在第三位

因此,您可以有效地获得:

-(100/-(100*10))=0

如果你把它们放入变量中,你就不会看到这种情况发生,因为在乘法之后没有一元运算发生

所以这里A和B是相同的,而C,D,E显示了你看到的结果(E有完整的括号)


你的问题是什么?为什么你认为你必须处理位,你在处理整数。整数/整数=整数。所以-100/-1000是0,我同意,
-
似乎确实导致流“出错”。如果您尝试
-100/(-100)*10
,您将得到结果
10
。似乎将
/
应用于等式中的值
-
,然后确定等式
100*10
。我不确定这是否是BOL的错误,但更重要的是,SQL Server的行为并不像预期的那样。也许值得提出一个问题,看看他们的反应如何;也许可以在文档中添加一条注释,告知“功能”。
SELECT-100/(-100)*10
也会返回10。看起来
-
被视为
-
运算符,只有在计算
100*10
后才能应用该运算符
A/-B*C
A B C
。根据文档,否定的优先级低于乘法,因此结果是
A/-(B*C)
。通过使用浮动常量,您可以更清楚地看到这一点:
12e/-13e*14e
vs,T-SQL中的另一个gem特性:)我想我现在必须审核所有代码才能搜索bug。这甚至比各种PHP更糟糕。理智的人认为一元运算符的优先级必须低于二元运算符的是什么?真正的区别可能是
-
是否被视为
-100
中的运算符。在某些语言中,它是整数语法的一部分。因此,它是一元
-
优先顺序中的一个错误。反直觉设计的赢家是…:微软-再一次“减号”是二进制。一元
-
为“负”。那些当他们的意思是“负10”时说“负10”之类的话的人是不精确的。@accumulation:不精确不是我的。
-
运算符应用于单个操作数时,在SQL查询计划中称为
减号。它的二进制对应项称为
SUB
。如果你愿意,可以将“一元减号”解释为“减号所表示的一元运算符”的简写形式——一种句法而非语义名称。“负10”是美国的标准用法(我相信),但在英国不是标准用法。
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