programing

SQL Server에서 이상한 작업 문제가 발생했습니다. -100/-100*10 = 0

javamemo 2023. 4. 25. 21:48
반응형

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)

수배가 잘못된 건가요, 아니면 제가 뭔가를 놓친 건가요?그런 것 같아요.-(예상된) 우선순위를 벗어 던지고 있습니다.

우선 순위 표에 따르면, 이것은 예상된 동작입니다.우선 순위가 높은 연산자입니다(/그리고.*)는 우선 순위가 낮은 연산자(단일)보다 먼저 평가됩니다.-) 그럼 이렇게 됩니다.

-100 / -100 * 10

는 다음과 같이 평가됩니다.

-(100 / -(100 * 10))

이 동작은 VB, JavaScript와 같이 단항 부정의 우선순위가 곱셈 및 나눗셈보다 높은 대부분의 프로그래밍 언어와는 다릅니다.

BOL이 정확합니다. -보다 우선 순위가 낮습니다.*,그렇게

-A * B

으로 구문 분석됩니다.

-(A * B)

곱셈은 동일한 우선순위의 다른 두 이진 연산자를 혼합하는 경우를 제외하고는 일반적으로 이 점을 인식하지 못합니다./그리고.%(그리고요.%이러한 복합 표현에는 거의 사용되지 않습니다.)그렇게

C / -A * B

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

C / -(A * B)

결과를 설명해 주세요.대부분의 다른 언어에서 단항 마이너스(unariary-negrative)가 다음 언어보다 우선하기 때문에 이는 직관에 반합니다.*그리고./하지만 T-SQL에는 없으며, 이 내용은 올바르게 문서화되어 있습니다.

좋은(?) 방법으로 설명할 수 있습니다.

SELECT -1073741824 * 2

산술 오버플로를 생성합니다.-(1073741824 * 2)생산합니다2147483648중간 매개체로써, 이 매개체는 맞지 않습니다.INT,그렇지만

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

언급URL : https://stackoverflow.com/questions/54513450/a-strange-operation-problem-in-sql-server-100-10010-0 입니다.

반응형