e5673.c

if(val & 2== 2)はBUG

 /* 警告:   B:e5673: 『x & 2 == 2』 は『x & (2 == 2)』となり『(x & 2) == 2』とは別です */ 

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

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