□ ビット演算やシフト演算の演算順位は勘違いしやすい


 C言語では、&,|,^ , <<, >> の優先順位が四則演算や比較演算に対し紛らわしい 順位にあります。  とくにアセンブラの感覚/優先順位で用いると勘違いしやすいように思えます。

 ビット演算子やシフト演算子は、速度や命令サイズの効率から (とくにアセンブラ経験者は) 2の乗数の性質を利用した掛算や割算・余算の代用としてよく用いるので、 掛算や割算と同様の優先順位を期待したいところなのです。

 が、実際のC言語では、<<,>> が+,-,より優先順位が下だったり、&,|,^ が >,>=,<,<=,==,!=より下だったり、さらに&,|,^間でも優先順位がちがったり、と、気をつけないと かなり思い違いをし兼ねないしろものです。

 なので、このようなものを用いるときは明示的に()をつけて対処したほうがよいです。

  たとえば、
    a = c >> 8 + 1;
   や
    if (a & b == 0)
  と書かれてあった場合、文法的には
    a = c >> (8 + 1);
   や
    if (a & (b == 0))
  なのですが、記述者は
    a = (c >> 8) + 1;
   や
    if ((a & b) == 0)
  のつもりだった可能性があります。

  たとえ、わかっていて前者のつもりで書いたとしても、  この手のものはとくに、他の人が見た場合に、正しいのか誤記なのか判断しずらく、 念のために記述者に確認を取る等の手間が増えるので、余計な手間を減らす意味でも、 意図を明確にするために () をつけるべきでしょう。