e159.c

算術演算|の周辺括弧必要


よくある例 /*******************************************************/ 悪い例

value = value & 0x0300 | 0x3 ;

/*******************************************************/ コンパイラは次の様に解釈する

value = (value & 0x0300) | 0x3 ;

/*******************************************************/ 悪い例の記述は 右辺と左辺の両方にvalueと言う変数が出現する文脈から判断して、 下記の様な事がしたかったと思われる(しかし実行結果が異なる

value &= (0x0300 | 0x3) ;

/*******************************************************/ 同じソース中に、 value = value & 0x300 ; の様な記述があった場合、 ほぼ確実に、このコーディングを行った人は

&=の記述方法を知らないと言える。

つまり、BUGである確率が非常に高い。
解説 ビット演算『|』とビット演算『&』のどちらが先に実行されるか わかりますか? 結合力の問題です。 答えは修正例2のように『&』が先に実行されます。 詳細な説明は、 『プログラミング言語C 第2版 ANSI規格準拠 カーニハン リッチー著/石田晴久訳』 「2.12 優先度と評価順序」Page65C-FAQ 3.4J C-FAQ 3.4E を参照して下さい。