すべての種類のtrue
おはようございます。本日の当番、プログラマのM.L.Kです(LはLieのLです、Lie&Rest!)。
世の中には2種類の人間がいます。
すなわち、プログラマと、そうでない人間、です。
そして、プログラマとは、
ある2種類の状態を定義する者と定義できます。
すなわち、真(true)と偽(false)です。
C言語で言うところの、if文だとか、while文などの条件分岐に使われるアレですね。
「定義っつっても、trueは“1”で、falseは“0”だろ」
確かに、仰るとおり。
例えば、C言語だと、
typedef int bool;
const bool true = 1;
const bool false = 0;
とか書いて、
trueとfalse自体を、1と0とに定義するのはよくある話です。
if(true)
{
printf("Hello World!");
}
と書けば、「Hello World!」と表示されますし、
if(false)
{
printf("Hello World!");
}
と書けば、表示されません。
if文内で、“true”= 真、“false”= 偽、と解釈されているからです。
定義が意図したとおりの挙動です。
では、
if(5)
{
printf("Hello World!");
}
では、どうでしょう?
結論を言えば、「Hello World!」は表示されます。
更に言えば、括弧内に0以外の数値が入る場合は、全て表示されます。
条件文での真偽判定は、0は偽、それ以外は全て真、ということになっているからです。
従って、
例えば、失敗時は0、成功時はその状態を数値で返す、とある関数、success()があったとして、
if( success() )
{
printf("success state = %d", success());
}
としたとき、成功時にのみ、「success state = ~」と、表示されます。
事実、このような使い方を期待して、関数を実装する場合が多々あります。
実際上の“真”の定義は、実装するプログラマ次第、ということですね。
ただ、便利な仕様ですが、これが思わぬ罠になることも。
成功 = 真 =“true”
という思い込みで、
if( success() == true )
{
printf("success state = %d", success());
}
と書いてしまい、いつまで経っても、成功の1種類の成功状態しか表示されない、なんてことに…。
もっとも、上の記述のようなミスが“確実”に起こるのは、C言語の話。
C++に至っては、コンパイル環境によっては、思惑通りの挙動になる場合もあります。
(整数型からbool型へのキャストが定義されているかどうかによると思われる)
思い込みに拍車をかける結果となります。
特に、C言語環境とC++環境を行き来するようでしたら、
if( success() != false )
というように記述する癖をつけたほうがいいかもしれません。
ちなみに、私はたまにこのミスをやってしまいます。
「謎の組織でも何でもいいから、頭脳はまんまで子どもに戻して欲しい」
と密かに思っているからですね。多分。
| 固定リンク
「プログラマー」カテゴリの記事
- ポジティブシンキング♪(2012.01.25)
- Simple is best(2011.12.19)
- 残り半月!(2011.12.16)
- もしもの時の為に(2011.12.15)
- OpenCVと某カメラを使う(2011.12.14)












コメント