2012-05-01 51 views
1

在C中,true是不为0的任何东西(但我们经常使用枚举为状态定义值)。所以,做试验的真理,我们可以做到以下几点:如何处理Tribools

typedef enum 
{ 
    FALSE, 
    TRUE 
} BOOL; 

// Some function 
BOOL n = isTrue(); 

if (n) 
{ 
    // Do something 
} 

其中还有一些争论,但我和其他人喜欢:

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

但是,如果由于某种原因,isTrue()函数返回一个值除了1以外,那么后者不起作用,而真则被视为错误。

我一直在经历一个代码审查标志着第一种方式要做到这一点的方式。但是我突然意识到,有时我们需要第三个状态的概念,当一个值没有被设置时。但是,它甚至有可能做到这一点在C和还是做我们的布尔比较在第一种方式,因为它似乎如果我们指定的任何其他值是这个“NULL”值,那么它仍然会记录为真正的

+0

恕我直言,第一个变体是**不是**首选到第二个。第二种方法更具可读性,除非你有适当的变量名称,比如'isBlue'等。 – Matthias

+0

@Matthias,它肯定是第二种,如果它只是因为'TRUE'不是标准中定义的,要使用的值是“true”或“1”。但对于'bool'来说,第一个是非常可取的。是否可以讨论这是针对其他类型的,比如指针,但不适用于'bool'。 –

+0

我不确定现在是否在C标准中存在布尔类型。大多数地方我都用c往往有真假这或许我应该让以上 – Firedragon

回答

4

你号将需要一个明确的比较。我会建议使用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),然后突出显示您必须与TRUE,FALSE或FILENOTFOUND进行比较(如您的示例中所示)。我也认为你应该有一个“空”的标志结构是另一种选择,但我很好奇,看看是否有更广泛的C世界的建议 – Firedragon

+0

@Firedragon:是的,确切的。在我的例子中,typedef被称为“真相”。 –

+2

因为我不确定Firedragon会得到的参考:http://thedailywtf.com/Articles/What_Is_Truth_0x3f_.aspx –

0

正如你写,任何不为0的计算结果为“真”。这意味着C是字面上下你所描述的情况确定的第三状态的无法:C仅“假”(这是0)和“未假”(即“真”,这是任何不区分0)。

A到基于枚举的解决方案稍有hackish的替代方法是做测试,如

#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。你可以使用-ve数字作为false,+ ve作为true,零作为“不知道”。

你会仍然需要小心,不要把它作为if (thing),但你必须与其他人的问题也是如此。