是否定义了负布尔值?

时间:2010-11-23 09:06:38

标签: c

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

(当我在一个问题中看到,有人宣传在枚举中将“真实”和“假”声明为1和0时,我开始考虑这个问题。)

5 个答案:

答案 0 :(得分:23)

这是定义的行为。我将寻找C99标准段落,如此

  

§6.3.1.2
  当任何标量值转换为_Bool时,结果为0   值比较等于0;   否则,结果是1。

答案 1 :(得分:2)

我认为0是假的,其他一切都是真的。

请在此处查看@ casper的回复:thread

  

我会在这里接受C的提示,其中false绝对定义为0,而true定义为非假。与真实的绝对值相比,这是一个重要的区别。除非您的类型只有两种状态,否则您必须考虑该值类型中的所有值,什么是真,哪些是错误。

答案 2 :(得分:2)

这是正确的行为,在C 0 False 其他一切 True

答案 3 :(得分:1)

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

在枚举中声明“true”和“false”是错误的,因为以下代码将会中断:

if (2 == TRUE)

(2应评估为“true”,但如果TRUE定义为1,则两个值不相等)。

答案 4 :(得分:-1)

C将0定义为false,将其他所有内容定义为true。积极的,消极的,无论如何。

我相信我最近主张使用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,但我可能错了,上述情况也适用。