1

在 C 中,任何不为 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。

我一直在通过代码审查标记第一种方式应该是这样做的方式。但是我突然意识到,有时我们需要在未设置值时使用第三种状态的概念。但是是否有可能在 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. 您可以使用 -ve 数字表示假,+ve 表示真,零表示“不知道”。

您仍然需要小心不要将其用作if (thing),但您也有其他问题。

于 2012-05-01T15:01:21.760 回答
0

正如您所写,任何不是 0 的东西都会评估为“真”。这意味着在您描述的情况下,C 实际上无法识别第三种状态:C 仅区分“假”(即 0)和“非假”(即“真”,即任何非 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 回答