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コンパイラ で動作が異なります。