【C言語】switch( bool式)を避けif文で単純に書こう(KISSの原則)

warning: switch condition has boolean value

警告:switch(条件式)がブール値を持つ
[-Wswitch-bool]

■この記事の概要

C言語でbool型を条件とするswitch文を避けるべき理由を解説し、単純なif文への置き換えを提案します。

KISSの原則に基づき、コードの可読性と効率を向上させる方法を具体例で説明しています。


■switch(bool式)は避ける

#include    <stdio.h>
#include    <stdbool.h>
char    *f(int x){
    switch(x >= 0){  //ダメ:switch(真偽値)は避けましょう
    case    true:   
        return  "0以上" ;
        break;
    case    false:  
        return  "0未満" ;
        break;
    default:        
        return  "有り得ない";
        break;
    }
}
int main(void){
    printf("%s\n",f(1));
    printf("%s\n",f(0));
    printf("%s\n",f(-1));
}

switch文は多分岐に適しているので
真か偽の2分岐しかないbool型の判定では
単純なif文を使いましょう。

➡if文を使った推奨修正例

#include    <stdio.h>
#include    <stdbool.h>
char    *f(int x){
    if(x >= 0)  return  "0以上";
    else        return  "0未満";
}
int main(void){
    printf("%s\n",f(1));
    printf("%s\n",f(0));
    printf("%s\n",f(-1));
}

■> と >> を間違えた

#include    <stdio.h>
int f(unsigned int x){
    switch(x > 8) {     //ダメ:> と >> を間違えた?
    case    0xFF:       return  1;
    case    0xFFFF:     return  2;
    case    0xFFFFFF:   return  3;
    default:            return  0;
    }
}
int main(void){
    printf("%x\n",f(0xFFFF));
}

上記はプログラマが
x>> 8(シフト命令)と記述する所を
x> 8(比較命令)と間違えた例です。


■bool変数に無理やり3を設定

#include    <stdio.h>
#include    <stdbool.h>
#include    <string.h>
char    *f(bool x){
    switch(x){ 
    case    true:   return  "true" ;
    case    false:  return  "false" ;
    default:        return  "default";
    }
}
int main(void){
    bool        b;
    memset(&b,0x3,sizeof(b));
    printf("%s\n",f(b));
}

bool変数に対して
*(char *)&b = 3 ; のような無理な代入を行うと
処理系依存とか未定義動作となるので止めましょう。

上記のコードでは 
gccコンパイラと 
clangコンパイラ で動作が異なります。

参考:

KISSの原則