web-dev-qa-db-ja.com

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 [〜#〜] 状態:

式内の2つの演算子の演算子優先順位が同じ場合、式内の位置に基づいて左から右に評価されます。

そして

_Level   Operators
  1     ~ (Bitwise NOT)
  2     * (Multiplication), / (Division), % (Modulus)
  3     + (Positive), - (Negative), + (Addition), + (Concatenation), - (Subtraction), & (Bitwise AND), ^ (Bitwise Exclusive OR), | (Bitwise OR)
_

BOLは間違っていますか、それとも何か不足していますか? _-_が(予想される)優先順位をスローしているようです。

104
cuizizhe

優先順位表によると、これは予想される動作です。優先順位の高い演算子(/および*)は、優先順位の低い演算子(単項-)。したがって、この:

-100 / -100 * 10

次のように評価されます。

-(100 / -(100 * 10))

この動作は、単項否定が乗算や除算よりも高い優先順位を持つほとんどのプログラミング言語とは異なることに注意してください。 [〜#〜] vb [〜#〜]JavaScript

94
Salman A

ドキュメントで(おそらく直感に反して)- (Negative)の優先順位は3番目であることに注意してください。

だからあなたは効果的に得る:

-(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
11
Jamie Pollard