2012-05-01 14 views
1

Cではtrueは0ではないものです(しかし、状態の値を定義するのにかなり頻繁にenumを使用します)。だから、真実のためのテストを行うために、私たちは、次の操作を行うことができます。Triboolsを扱う方法

そこにいくつかの議論があるが、自分自身や他の人がすることを好む
typedef enum 
{ 
    FALSE, 
    TRUE 
} BOOL; 

// Some function 
BOOL n = isTrue(); 

if (n) 
{ 
    // Do something 
} 

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

しかしisTrue()関数が値を返されたいくつかの理由であれば真以外の場合は1ではなく、真は偽と見なされます。

私は最初の方法がそれを行う方法でなければならないことを示すコードレビューを行ってきました。しかし、私は突然、値が設定されていないときに第3の状態のアイデアが必要になることを突然認識しました。しかし、C言語でこれを行うことも可能ですが、最初の方法でブール値の比較を行うことは可能ですか?この "NULL"値に他の値を代入すると、それはまだ真として記録されます。

+0

IMHO最初の亜種は、第2の亜種よりも優先されない**です。 2番目の変数は 'isBlue'などの適切な変数名を持たないかぎり、読みやすくなります。 – Matthias

+0

@Matthias「TRUE」が標準で定義されていない理由であれば、使用する値は 'true'または' 1'です。しかし、ブールの場合、最初の方が本当に好ましいです。これについては、これはポインタのような他の型のためだと話すことができましたが、 'bool'のためではありません。 –

+0

ブーリアンがC標準の型として存在するかどうかは確かではありませんでした。私が使用したほとんどの場所は、TRUEとFALSEのために定義された列挙型を持つ傾向があります。 – Firedragon

答えて

4

No. You明示的な比較が必要です。私は、明確にするためにenumタイプを使用することをお勧めし:これはにつながる

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

かなりクリーンなコードを構築します。

truth n; 

// ... 

switch (n) { 
case FALSE:   // Blah 
case TRUE:   // Blah 
case FILENOTFOUND: // Blah 
} 
+0

ありがとう。私は、型がTRIBOOLのtypedefのような特定の型としてそれらを持つこの3番目の状態を持つことができるところでは、TRUE、FALSEまたはFILENOTFOUND(あなたの例のように)と比較する必要があることを強調します。私はまたあなたが "ヌル"フラッグを持つ構造体をもう一つのオプションとして持つことができると考えましたが、より幅広いC世界に推薦があるかどうかを知りたいのです。 – Firedragon

+0

@Firedragon:そうです。私の例では、typedefは 'truth'と呼ばれています。 –

+2

私はFiredragonがリファレンスを取得するかどうか分からないので、http://thedailywtf.com/Articles/What_Is_Truth_0x3f_.aspx –

0

あなたは、0が「本当」と評価されていない何かを書いたように。つまり、Cは文字通りで、あなたが記述した状況下で第3の状態を識別することができないであることを意味しています:Cは「偽」(0)と「not-false」(「true」、 0)。列挙型ベースのソリューションへ

A少しハック代替は

#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*/ 
} 

のようなテストをやっているだろうが、私は率直に言って、それをお勧めしません。

+0

実際には、比較の順序を誤って切り替えるとコードが壊れてしまうので、これはお勧めしません。 –

+2

あなたはまだ時折それを見ます - それが私がそれを言及すると思った理由です - しかし、それは悪い考えです、私は同意します。 – Yuka

+0

私はそれを行うためのハックな方法のように見えることに同意しますが、この方法で "できる"ことを示すことは有用です。時々、それを行う方法を示して、あなたが学習するのに良いべきではない理由を言うと、私はそれがコードで見られるようになった場合にはうまくいくと思います。 – Firedragon

1

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

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

関連する問題