ショートカット
ファシリテーター × あり方
コーディングの向こう側
Hello, ANOTHER world!
オブジェクト指向のはなし
プログラミングのはなし
C言語実力診断クイズ
eSkillBooks
プログラミングのはなし

論理型をつかいこなす

ブーリアン(論理型)は非常に使い所が多い型です。

成功・失敗を返却する

例えばゼロ以上の int 値を返却する関数

int SomeFunc()

があったとします。この関数がエラー時に負の値を返却するとしたらどうでしょう。おそらく呼び出し側では次のようなコーディングが必要になります。

SAMPLE
CODE
int nResult = SomeFunc();

if ( nResult >= 0 ) {
    // 通常の処理
}
else {
    // エラー処理
}

このようなコーディングをするためには、プログラマーはこの関数がエラーのときに負の値を返すことを知っていなければなりません。

問題なのは、うっかり忘れるかもしれないということです。この例では関数のプロトタイプを見ただけではエラーのことを思い出すことはできそうもありませんから、もしかするとプログラマーはエラー処理を忘れるかも知れません。

そこで、関数のプロトタイプを

bool SomeFunc( int *pResult )

のように変更します。すると、プログラマーはこの関数を使おうと思ってプロトタイプを見るたびに bool 型の戻り値に気付き、エラー処理のことを思い出すようになるでしょう。

なお、この場合の呼び出し側のコーディングはだいたい次のようになるでしょう。

SAMPLE
CODE
int nResult = 0;

if ( SumeFunc( &nResult ) == true ) {
    ASSERT( nResult >= 0 );

    // 通常の処理
}
else {
    // エラー処理
}
ブロック内の処理の成功・失敗を保存する

部分的な処理の成功・失敗をあとで判定するために bool 値を使うことがよくあります。例えば次のような場合です。

SAMPLE
CODE
bool bSuccess = false;
{
    for ( ... ) {
        if ( ... ) {
            bSuccess = true; // 成功
            break;
        }
    }
}

if ( bSuccess == true ) {
    // 成功時の処理
}
else {
    // 失敗時の処理
}

この方法は、手前の処理が成功したときだけ次の処理が可能な場合(例えばファイルのオープンと読み込み)にとくに有効です。

C言語でブーリアンを使うには?

最新の C++ コンパイラでは bool 型のサポートがありますが、C コンパイラでは bool が使えません。そこで自分で定義する必要があります。例えば次のようにすれば良いでしょう。

SAMPLE
CODE
#ifndef __cplusplus
    typedef int bool;
    #define true  1
    #define false 0
#endif
または
SAMPLE
CODE
#ifndef __cplusplus
    typedef enum {
        false = 0,
        true  = 1
    } bool;
#endif

(「プログラミングのはなし」は1998年1月から1999年1月にかけて作成されたコンテンツです。)