[sql] SQL Server의 이상한 작업 문제 : -100 / -100 * 10 = 0

  • 실행 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

다음과 같이 평가됩니다.

-(100 / -(100 * 10))

이 동작은 단항 부정이 곱셈 및 나눗셈보다 우선하는 대부분의 프로그래밍 언어 (예 : VB , JavaScript )와는 다릅니다 .


답변

BOL이 맞습니다. -보다 우선 순위가 낮 *으므로

-A * B

다음과 같이 구문 분석됩니다.

-(A * B)

: 곱셈 그것이 무엇인지되고, 일반적으로 동일한 우선 순위가 다른 두 이항 연산자에 혼합하는 경우를 제외하고,이 통지를하지 않습니다 /%(과 %거의 같은 화합물 표현식에서 사용되지 않습니다). 그래서

C / -A * B

다음과 같이 구문 분석됩니다.

C / -(A * B)

결과를 설명합니다. 대부분의 다른 언어에서 단항 마이너스가 *및 보다 우선 순위가 높지만 /T-SQL에서는 그렇지 않기 때문에 이것은 직관적이지 않습니다.

그것을 설명하는 좋은 (?) 방법 :

SELECT -1073741824 * 2

에 맞지 않는 중간으로 -(1073741824 * 2)생성 하기 때문에 산술 오버플로를 생성 하지만2147483648INT

SELECT (-1073741824) * 2

예상되는 결과를 생성합니다 -2147483648.


답변

문서에서 (아마도 직관에 반하는) 우선 순위 - (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


답변