2016-12-30 27 views
0
var = 86 
print((var<90) & (var>=80)) 

これは真のPythonのビット演算子 '&' 演算子

しかし

print(var<90 & var>=80) 
print(var<90 & (var>=80)) 
print((var<90) & var>=80) 
print(var<90 & True) 

`

なぜ、これらすべてがFalse与えるかを与えますか?

+3

ビット演算子を使用してブール演算を実行しようとしているのはなぜですか? –

+0

'&'を 'と'に置き換えてみてください。あなたがしていることは本当に意味をなさない。 – 101

+0

私は 'and'演算子を使用すると思います。彼らがなぜFalseを与えていたのかを知りたかっただけです。 @ IgnacioVazquez-Abrams –

答えて

1

Operator precedence

print(var<90 & True)print(var < (90 & True))と同等であるため、それはFalseを与え、一例としてprint(var<90 & True)を取るためです。

ただし、正しい場所にカッコを入れた場合(print((var<90) & True))、Trueになります。

+0

最初に実行される演算子はどれですか? – dsgdfg

+0

このドキュメントは 'priority'定義を含んでいません。 '' a >> b&c < e dsgdfg

+1

@dsgdfgドキュメントでは、「次の表は、最も低い優先順位(最小のバインディング)から最も高い優先順位(ほとんどのバインディング)までのPythonの演算子優先順位を要約しています。 –

0

ビット演算子&は、比較演算子よりも高い優先順位を持ちますので、最初に90 & varが評価され、次に連鎖比較が行われます。

>>> var = 86 
>>> var<90 & var>=80 # var<90, and '90&var' is greater than or equal to 80 
False 
>>> var<(90 & var)>=80 # same as above 
False 
>>> (var<90) & (var>=80) 
True 
3

ブール演算ではなくand演算子を使用する必要があります。

関係演算子をチェーンPythonのサポートが(つまりあなたの代わりに0 < var and var < 1000 < var < 100を使用することができます)と(すなわち、加算、減算、ビット演算など)による演算子の優先順位に前に関係演算子を二項演算を処理するので、失敗のすべて投稿したケースは実際に何か他のものを意味します。

  1. var < 90 & var >= 80(var < 90 & var) and (90 & var >= 80)
  2. var < 90 & (var>=80)に相当し、第4の場合を見ているvar < 90 & Trueに相当します。
  3. (var<90) & var>=80もまた第4の場合(これはTrue & var >= 80に解決され、0 >= 80に解決されます)に似ています。
  4. var < 90 & Trueは、var < (90 & True)に相当します。 &演算子の実装は、オペランドのいずれか1つが整数でない場合(動的タイピングの最大の落とし穴の1つである)、0を返すように設計されているため、このような類似の文はすべてvar < 0になります。