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は間違っていますか、それとも何か不足していますか? _-
_が(予想される)優先順位をスローしているようです。
優先順位表によると、これはが予想される動作です。優先順位の高い演算子(/
および*
)は、優先順位の低い演算子(単項-
)。したがって、この:
-100 / -100 * 10
次のように評価されます。
-(100 / -(100 * 10))
この動作は、単項否定が乗算や除算よりも高い優先順位を持つほとんどのプログラミング言語とは異なることに注意してください。 [〜#〜] vb [〜#〜] 、 JavaScript 。
ドキュメントで(おそらく直感に反して)- (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