반대 - SQL Server의 이상한 작동 문제(-100/-100*10=0)




sql offset (2)

BOL은 정확합니다. - 보다 * 우선 순위가 낮습니다.

-A * B

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

-(A * B)

곱셈이 무엇인지 알기 때문에, 다른 우선 순위가 다른 2 진수 연산자 인 /% (와 % 는 이처럼 복합 표현식에서는 거의 사용되지 않습니다.)에서 혼합 할 때를 제외하고 일반적으로이를 알지 못합니다. 그래서

C / -A * B

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

C / -(A * B)

결과를 설명합니다. 대부분의 다른 언어에서 단항 빼기가 */ 보다 우선 순위가 높지만 T-SQL에서는 그렇지 않으므로이 내용이 올바르게 문서화되어 있기 때문에 반 직관적입니다.

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

SELECT -1073741824 * 2

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

SELECT (-1073741824) * 2

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

  • 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이 잘못 되었습니까, 아니면 뭔가 빠졌습니까? 그것은 (예상) 우선 순위를 던지고있는 것 같습니다.


문서에서 (아마도 반대 직관적으로) - (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






operator-precedence