web-dev-qa-db-ja.com

なぜビット演算子は比較より優先順位が低いのですか?

誰かがその根拠を説明できますか、なぜ最も人気のある言語の束(以下の注を参照)で比較演算子(==、!=、<、>、<=、> =)がビット単位演算子(&、|、^ 、〜)?

この優先順位が自然な使用法に遭遇したことはないと思います。それは常に次のようなものです:

  if( (x & MASK) == CORRECT ) ...   // Chosen bits are in correct setting, rest unimportant

  if( (x ^ x_prev) == SET )      // only, and exactly SET bit changed

  if( (x & REQUIRED) < REQUIRED )   // Not all conditions satisfied

私が使用するケース:

  flags = ( x == 6 | 2 );     // set bit 0 when x is 6, bit 1 always.

ほぼ存在しない。

このような演算子の優先順位を決定する言語デザイナーの動機は何でしたか?


たとえば、上位12言語のSQLを除くすべては、langpop.comの プログラミング言語の人気度 リストのようなものです:C、Java、C++、PHP、JavaScript、Python、C#、Perl、SQL、Ruby 、シェル、Visual Basic。

63
SF.

言語はそれをCからコピーしました、そしてCの場合、デニス・リッチー 説明 最初は、B(そしておそらく初期のC)では、コンテキストに応じて1つのフォーム&しかありませんでした。ビットごとまたは論理的なもの。その後、各関数は演算子を取得しました。ビット単位の場合は&、論理値の場合は&&です。それから彼は続けます

彼らの遅々とした導入は、Cの優先規則の無意味さを説明しています。 Bでは、

if (a == b & c) ...

abと等しく、cがゼロ以外であるかどうかを確認します。このような条件式では、&の優先順位を==よりも低くすることをお勧めします。 BからCへの変換では、そのようなステートメントで&&&に置き換えたいと思います。変換を簡単にするために、&演算子の優先順位を==と同じにして、&&の優先順位を&からわずかに分割することにしました。今日、&==の相対的な優先順位を移動し、それによって一般的なCイディオムを簡略化することが望ましいと思われます。マスクされた値を別の値に対してテストするには、

if ((a & mask) == b) ...

内側の括弧は必須ですが、忘れがちです。

72
AProgrammer

ビット演算子は、概念的にも外観的にも論理演算子に関連しています。おそらく、優先順位表でそれらが互いに近い理由を説明しています。おそらく、&==よりも高いのは紛らわしいが、&&==よりも低いと主張することもできます。

優先順位の前例(!)が設定されたら、一貫性を保つために他の言語がそれに従うのがおそらくより良いでしょう。

ただし、これは最適ではないという意見に同意する傾向があります。実際の使用では、ビット演算子は論理演算子よりも数学演算子に似ており、優先順位で数学演算子とグループ化されたほうがよいでしょう。

7
user82096