1

C では、true は 0 以外のものです (ただし、状態の値を定義するために列挙型を使用することがよくあります)。したがって、真実のテストを行うには、次のことができます。

typedef enum
{
    FALSE,
    TRUE
} BOOL;

// Some function
BOOL n = isTrue();

if (n)
{
    // Do something
}

議論はありますが、私や他の人たちは次のことを好みます。

if (n == TRUE)
{
    // Do something
}

しかし、何らかの理由でisTrue()関数が true に対して 1 以外の値を返した場合、後者は機能せず、true は false と見なされます。

私は、最初の方法がそれを行う方法であるべきであることを示すコードレビューを行ってきました。しかし、値が設定されていないときに 3 番目の状態のアイデアが必要になる場合があることに突然気付きました。しかし、Cでこれを行うことさえ可能であり、最初の方法でブール比較を行うことは可能ですか?他の値をこの「NULL」値に割り当てると、trueとして記録されます

4

3 に答える 3

4

いいえ。明示的な比較が必要です。enumわかりやすくするために、タイプを使用することをお勧めします。

typedef enum {
    FALSE = 0,
    TRUE = 1,
    FILENOTFOUND = 2
} truth;

これにより、かなりクリーンなコード構造が得られます。

truth n;

// ...

switch (n) {
case FALSE:          // Blah
case TRUE:           // Blah
case FILENOTFOUND:   // Blah
}
于 2012-05-01T11:32:56.460 に答える
1

私はを選ぶように誘惑されるでしょうint。falseには-veの数値、trueには+ ve、「わからない」には0を使用できます。

それでも、として使用しないように注意する必要がありif (thing)ますが、他の人にもその問題があります。

于 2012-05-01T15:01:21.760 に答える
0

あなたが書いたように、0でないものはすべて'true'と評価されます。つまり、Cは、説明した状況では文字通り3番目の状態を識別できません。Cは「false」(0)と「not-false」(つまり、「true」、つまり0ではないもの)のみを区別します。 。

列挙型ベースのソリューションの少しハックな代替手段は、次のようなテストを行うことです。

#DEFINE NOTSET -1


if (a == NOTSET) {
    /* Stuff that happens when a is not set*/ 
}

else if (a) {
    /* Stuff that happens when a is true*/
}

else {
    /*Stuff that happens when a is false*/
}

でも率直に言ってお勧めしません。

于 2012-05-01T11:34:08.330 に答える