【C言語】
冗長な条件 if(x > 10 && x > 11)
(Redundant condition)

Redundant condition 冗長な条件

(style) Redundant condition: If ‘x > 11’, the comparison ‘x > 10’ is always true.

冗長な条件。x > 11’の場合、比較の’x > 10’は常に真。
[(style)redundantCondition]


■制御が来た時if文は必ず成立する

#include <stdio.h>
void    f1(int x) {
    if(x > 11){
        if(x > 10) //★ここに制御が来た時if文は必ず成立する 
            printf("来る:%s:%d\n",__func__,__LINE__);
        else 
            printf("★来ない1 x=%d\n",x);
    } else {
        if(x <= 11) //★ここに制御が来た時if文は必ず成立する
            printf("来る:%s:%d\n",__func__,__LINE__);
        else
            printf("★来ない2 x=%d\n",x);
    }
}

■制御が来た時if文は必ず成立しない

void    f2(int x) {
    if(x > 10){  
        printf("来る:%s:%d\n",__func__,__LINE__);
        return  ;
    } 
    if(x > 11){ //★ここに制御が来た時if文は必ず成立しない
        printf("★来ない3 x=%d\n",x);
        return ;
    }
}

■第二条件だけで充分

int f3(int x) {
    if(x > 10 && x > 11)//★NG
        return  1;
    return  0;
}


cppcheckとclang-tidyが警告してくれます


■冗長コードの括弧がうるさい

//  cppcheck  --enable=all
#include    <stdio.h>

//お金と暇
char *GOTOtravel(int Money,int freetime) {
    if((Money == 0) || ((Money != 0) && (freetime == 0)))//冗長コード
        return  "止めた";
    return  "行こう";
}
int main(void){
    printf("%s\n",GOTOtravel(0,0));
    printf("%s\n",GOTOtravel(0,1));
    printf("%s\n",GOTOtravel(1,0));
    printf("%s\n",GOTOtravel(1,1));
}

‘x==0 || (x!=0 && y==0)’ は
‘x==0 || y==0’と同じです。

第1条件が成立した時は
第2条件はもう判定する必要がありません。
これを論理演算子の「ショートサーキット」動作と言います。


第1条件が成立しなかった時、
x!=0が確定しているので
第2条件で
x!=0を判定する必要がありません。


➡冗長コードを削除した修正例

//  cppcheck  --enable=all
#include    <stdio.h>

//お金と暇
char *GOTOtravel(int Money,int freetime) {
    if(Money == 0 || freetime == 0)
        return  "止めた";
    return  "行こう";
}
int main(void){
    printf("%s\n",GOTOtravel(0,0));
    printf("%s\n",GOTOtravel(0,1));
    printf("%s\n",GOTOtravel(1,0));
    printf("%s\n",GOTOtravel(1,1));
}

参考:

適当に括弧を使おう(使いすぎると、今度は読みにくくなる。良く考えて書こう)

EXP02-C. 論理 AND 演算子および論理 OR 演算子のショートサーキット動作について注意する

MSC12-C. プログラムに対して作用しないコードを検出して削除する
CWE-561: Dead Code
CWE-571: Expression is Always True
CWE-1041: Use of Redundant Code