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)
この場合、
問題はありませんので、
すみませんが警告を無視して下さい。