ビット演算(&とか|)は比較演算(==とか)より優先度が低いんですね.
つまり,
(x>>i)&y != 0は
(x>>i) & (y != 0)と解釈されてしまうんですね.
大抵の場合,これは考えている順番とは違うのでは?
他の算術演算(+とか)やシフト演算では,比較演算より優先度が高いですし.
StackOverflowでちょうど同じ質問があり,答えとしては,
- 慣れろ
- KernighanやDennis Ritchieに聞くしかない
- 短絡評価のない論理演算の代わりに使う場合
if (x == 1 & y == 0) {
/* ... */
}
のような場合,この優先度でないとうまく行かないと補足説明があります.
実際,Dennis Ritchieの説明では,- 元々C言語には&&や||は無かった
- &&や||が必要な場面では"truth-value context"で代用 ifなど論理値が必要とされる所では,ビット演算では無く&&や||となる仕組み
- &&と||が追加され,ビット演算の&,|と短絡評価の&&,||が分離 される
- Dennisは優先度の問題について気づいたが,すでに既存のコードがありすぎた…
これもバッドノウハウの一つでしょうか?
0 件のコメント:
コメントを投稿