« プログラマーの限界 | トップページ | 気分は名探偵 »

2008年7月17日 (木)すべての種類の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;

とか書いて、
truefalse自体を、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 )

というように記述する癖をつけたほうがいいかもしれません。

ちなみに、私はたまにこのミスをやってしまいます。
「謎の組織でも何でもいいから、頭脳はまんまで子どもに戻して欲しい」
と密かに思っているからですね。多分。

follow us in feedly
result = encodeURIComponent( "http://www.accessgames-blog.com/blog/2008/07/true_a0cc.html" );document.write( "result = " , result );&media=https%3A%2F%2Ffarm8.staticflickr.com%2F7027%2F6851755809_df5b2051c9_z.jpg&description=Next%20stop%3A%20Pinterest">

| | コメント (0) | トラックバック (0)

« プログラマーの限界 | トップページ | 気分は名探偵 »

プログラマー」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック


この記事へのトラックバック一覧です: すべての種類のtrue:

« プログラマーの限界 | トップページ | 気分は名探偵 »