プログラムをしていると、真と偽の二つの値をとる型が欲しいときがあります。
真と偽は普通 TRUEとFALSEで表現します。
TRUE 真
FALSE 偽
真と偽のニ値しか取らないタイプの型です。
C言語にはそのような型はありませんので、みな勝手に作るわけです。
多くの場合 BOOL とか BOOLEAN という型名となります。
この定義もプログラマーの考え方などによりちょっと違ってくるのです。
定義例
#define TRUE (1==1)
#define FALSE (!TRUE)
定義例2
#define TRUE 1
#define FALSE 0
定義例3
#define FALSE 0
#define TRUE (!FALSE)
BOOLのtypedef も
int の人がいたり char (一番小さい型)だったりと様々。
このあたりのいいかげんさが、複数の人で開発したり、移植したりする際にバグの原因となったりするわけです。
特に条件判断をするところではよく間違いが起きます。
IPA 独立行政法人 情報技術処理推進機構 ソフトウェアエンジニアリングセンターで出している
組み込みソフトウェア 開発向けコーディング作法ガイド[C言語板]でも
R2.2.1 真偽を求める式の中で、真として定義した値と比較しない。
としています。
例として func1の戻り値が真であれば括弧内のコードを実行するソースコードの場合は
○
if(func1() != FALSE ){
;
}
○
if(func1() ){
;
}
× if(func1() != TRUE){
;
}
※func1()の真と TRUE が必ずしも一致するとは限らないため
私は最近 0,1を直接表現する方法に戻っています。
格納変数は isXXXXX と言う名前にします。
これはプログラミング作法という本から影響されました。
例えば以下のような関数があるとすると
int isCommandA( void );
関数の実行結果が OKであれば 1 ,NGであれば 0 となります。
これだと TRUE/FALSE よりも分かりやすいと思います。
C言語の標準関数に isdigit()等の is系の関数があるので、特に説明しなくてもC言語プログラマには直感で理解していただけるのではないかと思います。
もっとも is系の関数は 真であれば 0以外の数が戻り値となるとあるので、
×
if( 1 == isCommandA()){
}
という書き方は禁止です。
◆◆ 参考書籍 ◆◆
◆組み込み技術のエキスパート ビーコン