e37.c

if(val & 2== 2)はBUG


/* 修正前 */ if(c & 2 == 2) /* ←BUG */
/* コンパイラはこう解釈する */ if( c & (2 == 2))
/* 修正例 */ if((c & 2) == 2)

解説 修正例1のように『==』が先に実行されます。 詳細な説明は、 プログラミング言語C 第2版 ANSI規格準拠 カーニハン リッチー著/石田晴久訳』 「2.12 優先度と評価順序」Page65 C-FAQ 3.4J C-FAQ 3.4E を参照して下さい たまに&と&&の違いを知らない人がいる!