【C言語】演算子の優先順位を久しぶりに復習
本ブログの趣旨とは異なりますが、たまにはプログラミングのお話でも。
他社が作ったコードでバグが仕込まれていたのを
泣きながら解析したのでメモ。
バグっているコードのサンプル。
if ((flag & A_MASK_BIT) &&
(flag & (B_MASK_BIT | C_MASK_BIT) == 0) ){
flagはint型の変数で、各ビットに意味を持たせてある。
A_MASK_BIT、B_MASK_BIT、C_MASK_BITは定数で、
それぞれ0x1,0x2,0x4とする。
A_MASK_BITが立っていて、B_MASK_BITとC_MASK_BITが立っていなければ
ifの中を処理するというロジックにしたかったのだと思われる。
ただ、下の行の処理は演算子の優先度的に
参考:
1. (B_MASK_BIT | C_MASK_BIT) //0x6
2. 1の結果と == 0の評価 //必ず偽になる
3. 2の結果とflagのビットAND //0とAND取ったら0
となってしまう。
つまりこのif文の評価は必ず偽になってしまう。
僕は[ビットが立っていなければ」という条件はびっくりマーク(否定)
で表現するのが好みなので、正しく修正するとこう。
if ((flag & A_MASK_BIT) &&
!(flag & (B_MASK_BIT | C_MASK_BIT))) {
自分で実装する時は演算子の優先度なんて意識しない作りにするだけに、
久しぶりに「これってどの順で処理されるんだっけ?」と思い返した。