e159.c
算術演算|の周辺括弧必要




よくある例
/*******************************************************/
悪い例
value = value & 0x0300 | 0x3 ;
/*******************************************************/
コンパイラは次の様に解釈する
value = (value & 0x0300) | 0x3 ;
/*******************************************************/
悪い例の記述は
右辺と左辺の両方にvalueと言う変数が出現する文脈から判断して、
下記の様な事がしたかったと思われる(しかし実行結果が異なる)
value &= (0x0300 | 0x3) ;
/*******************************************************/
同じソース中に、
value = value & 0x300 ;
の様な記述があった場合、
ほぼ確実に、このコーディングを行った人は
&=の記述方法を知らないと言える。
つまり、BUGである確率が非常に高い。
解説
ビット演算『|』とビット演算『&』のどちらが先に実行されるか
わかりますか? 結合力の問題です。
答えは修正例2のように『&』が先に実行されます。
詳細な説明は、
『プログラミング言語C 第2版 ANSI規格準拠
カーニハン リッチー著/石田晴久訳』
「2.12 優先度と評価順序」Page65
か
C-FAQ 3.4J
C-FAQ 3.4E
を参照して下さい。