e8.c

常に成り立つ?


static void sample1() { /************************************************ 悪い例1 *************************************************/ if(value == CONST1 || CONST2) { /* 処理 ; */ } /************************************************ 修正例1:恐らくやりたい事は次の事。 *************************************************/ if(value == CONST1 || value == CONST2) { /* 処理 ; */ } }
static void sample2() { /*********************************************** 悪い例2 *************************************************/ if( CONST1 == value ) max = 1 ; else if( CONST2 == value || CONST7 || value ) max = 2 ; /* ↑★恐らく==の間違い*/ else if( CONST3 == value ) max = 3 ; else if( CONST4 == value ) max = 4 ; else if( CONST5 == value ) max = 5 ; else if( CONST6 == value ) max = 6 ; else max = 0 ; /*********************************************** 修正例2 悪い例1は、==と記述する所を、||と記述した単なるケアレスミスです。 どうせ、修正するならば この様な場合、else if文より、 switch文の方が適しています。 さらに、下記の場合はマルチステートメント(=1行に複数文記述する事)の方が 見やすいです。 *************************************************/ switch(value) { case CONST1: max = 1 ; break ; case CONST2: case CONST7: max = 2 ; break ; case CONST3: max = 3 ; break ; case CONST4: max = 4 ; break ; case CONST5: max = 5 ; break ; case CONST6: max = 6 ; break ; default : max = 0 ; break ; } }
解説: (1) 巨大関数形式マクロ展開時、下記Cソース展開となり、 警告が発生する事があります。 if(定数1==定数2) この場合、 本当に関数ではダメで マクロでなければならないのか検討して下さい。 (2) 機械生成された下記Cソースコードに対して 警告が発生されます。 if(1) if(1 && 1) if(value && 1) この場合、 問題はありませんので、 すみませんが警告を無視して下さい。