理由を説明してもらえますか、なぜ最も一般的な言語の束(下記の注を参照)で比較演算子(==、!=、<、>、<=、> =)がビットごとの演算子(&、|、^ 、〜)?
この優先順位が自然な使用法に出会ったことはないと思います。それは常に次のようなものです:
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、Shell、Visual Basic)に類似しています。
[arithmetics] [logic operator] [arithmetics]
です。ほとんどのプログラマーは、混乱のような括弧を作成しませんif(((x+getLowX()) < getMinX) || ((x-getHighX())>getMaxX())))
-ほとんどが論理よりも算術のif( ( x + getLowX() < getMinX ) || ( x - getHighX() > getMaxX() ))
優先順位を仮定し、+
上記の優先順位を仮定して記述し<
ます。これでif( x ^ getMask() != PATTERN )
、XORは算術演算子であり、直感的に同じように動作するはずです。解釈されたという事実if( x ^ ( getMask() != PATTERN ) )
は完全に直感に反します。