如何处理Tribools

时间:2012-05-01 11:30:15

标签: c

在C中,true是任何不为0的东西。(但我们经常使用枚举来定义状态的值)。因此,要对真相进行测试,我们可以执行以下操作:

typedef enum
{
    FALSE,
    TRUE
} BOOL;

// Some function
BOOL n = isTrue();

if (n)
{
    // Do something
}

存在一些争论,但我和其他人更愿意:

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

但是如果由于某种原因,isTrue()函数返回的值不是1,则为true,则后者不起作用,而true则视为false。

我一直在进行代码审查,标志着第一种方式应该是这样做的。但是我突然意识到,有时我们需要在没有设置值的情况下获得第3个状态。但是,甚至可以在C中执行此操作并仍然以第一种方式执行我们的布尔比较,因为如果我们将任何其他值指定为此“NULL”值,那么它仍将记录为真

3 个答案:

答案 0 :(得分:4)

没有。您需要进行明确的比较。为清晰起见,我建议使用enum类型:

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

这会导致相当干净的代码构造:

truth n;

// ...

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

答案 1 :(得分:1)

我很想选择int。你可以使用-ve numbers表示false,+ ve表示true,零表示“不知道”。

您仍然需要注意不要将其用作if (thing),但您也会遇到其他问题。

答案 2 :(得分:0)

正如您所写,任何非0的内容都会评估为' true'。这意味着在你所描述的情况下,C在字面上无法无法识别第三种状态:C只能区分错误' (这是0)和' not-false' (即e。' 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*/
}

但我坦率地不推荐它。