在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”值,那么它仍将记录为真
答案 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*/
}
但我坦率地不推荐它。