2010-11-23 67 views
10

在C中,除了0以外,至少每个正值都被视为一个布尔值true。但是,负面价值呢?我做了一些测试,似乎也将负值视为布尔真。这是一个特定的行为或实现吗?是否定义了负值布尔值?

(我来想想这个,当我在一个问题中看到,有人促进宣布“真”,并在一个枚举为1和0“假”)

+0

所有不是`false`的都是`true`? – khachik 2010-11-23 09:11:29

+0

我认为这个http://stackoverflow.com/questions/727196/boolean-true-positive-1-or-negative-1会回答你的问题 – 2010-11-23 09:27:43

回答

23

这是定义的行为。我会寻找C99标准段落说明这样

§ 6.3.1.2
当任何标量值转换为_Bool,其结果是,如果 值进行比较等于0 0; 否则,结果为1.

+2

+1指向标准。 – Jay 2010-11-23 09:19:43

+0

+1标准`bool`很好。如果特定的编译器缺少C99支持,我使用`enum`作为后备。 – 2010-11-23 09:20:43

1

在C中,没有布尔类型; 0和0.0f在布尔上下文中被认为是“假”,其他的都是“真”。

中声明枚举“真”与“假”是错误的,因为那样的话下面的代码将打破:

if (2 == TRUE) 

(2应该评估为“真”,但如果真被定义为1 ,这两个值不被认为是相等的)。

2

我相信0是错误的,其他一切都是真实的。

见@卡斯帕的答复这里:thread

我会采取一个暗示从这儿用,其中虚假绝对定义为0,而真正被定义为不假。与绝对值相比,这是一个重要的区别。除非你有一个只有两种状态的类型,否则你必须考虑该值类型中的所有值,什么是真的,什么是错误的。

2

这是正确的行为,在C 是一切

-1

C定义0为假,一切为真。积极,消极,无论如何。

我相信我最近主张使用typedef enum { false, true } bool;,所以我会自己去做。 (如果我原来的代码没有一个typedef参与,这是判断错误在我的部分。)所有非零值是真实的,所以我不主张以枚举型bool对于这样的事情:

if(x == true) // not what you want 
if(!x == false) // works, but why so much effort? 

我通常只是简单地按照if(x)if(!x)对布尔值进行显式测试。但是,有时这是很好的有一个布尔类型:

bool is_something(int x) 
{ // assume for the sake of an argument that the test is reasonably complex 
    if(/* something */) return false; 
    if(/* something else */) return true; 
    return false; 
} 

这只不过是具有类型是int更好,但至少你是明确什么结果意味着。

而且,按照别人以上,更好的bool可能是:

typedef enum { false, true = !false } bool; 

我相信!保证返回0或1,但我可能是错的,而上述作品以及两种方式。