在C中,至少除了0之外的每个正值都被视为布尔值true。但负面价值呢?我做了一些测试,似乎负值也被视为布尔值true。这是特定的行为或实现吗?
(当我在一个问题中看到,有人宣传在枚举中将“真实”和“假”声明为1和0时,我开始考虑这个问题。)
答案 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,但我可能错了,上述情况也适用。