在C语言中,bool类型中,true等于1,false等于0吗?

34

仅为澄清,我找到了类似的答案,但是针对的是C++。由于我对编程还比较新,不确定它是否也适用于C。


1
表达式 true == 1false == 0 都是正确的。(而且 true == 2 不正确)。如果这不是你的意思,能否澄清一下问题? - M.M
1
while(X) is equivalent to while( (X) != 0 ) - M.M
@M.M 你确定你不是只在谈论stdbool.h吗?“到处”都是2 == true... - The incredible Jan
@TheincredibleJan true 是由 stdbool.h 定义的,它是 C 标准库的一部分。我在谈论 C 语言,这并不奇怪。 - M.M
显示剩余2条评论
2个回答

71

更准确地说,任何非 0 的值都是真。

因此,1 是真的,但是 23……也是真的。


4
这个问题似乎涉及到特定的实体:“bool”、“true”和“false”,而不是一般的值集合,该集合可以使“if”执行真分支。 - AnT stands with Russia
2
@AnT如果他没有说自己是编程新手,我就会进一步解释。但很容易看出这是他的意思。 - Neil Locketz
5
取决于“是真的”这个词的含义。true标识符是在<stdbool.h>中定义的一个宏,它的值具体为1(类型为int)。另一方面,任何非零值在作为条件时被视为真。这就是为什么像if (b == true)这样的语句是危险的;只需写成if (b)即可。 - Keith Thompson
这就是为什么在我看来,bool 只适用于设置值而不是测试。对于测试来说,在 C 语言中已经内在化了,没有任何正式的定义。我会更进一步:bool 类型完全无用,除非可能与那些 true-1 的语言区分开来,但同样适用:0 为假,其他任何值都为真。 - Weather Vane
更准确地说,任何与0相等的东西都是假的。空指针可能不是0,但与0相等,因此在if(null_pointer)中也是假的。 - chux - Reinstate Monica
这个答案帮助我理解了:0 和 'odd' Out[]: 0 :::: 1 和 'odd' Out[]: 'odd' - dgor

6
您没有说明您关心哪个版本的C语言。让我们假设是这个版本:http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf。通过阅读规范,您会发现标准定义的truefalse分别为1和0。
如果您的问题涉及不同版本的C语言或者非标准定义的 truefalse,请提出更具体的问题。

2
C语言中的又一个奇怪问题... true 是一个整数,而不是布尔类型 - M.M
2
N1256 是1999年ISO C标准的草案。最新的标准是C11;最新的草案是N1570_Bool<stdbool.h>是由C99添加到语言中的(当然也保留在C11中)。 - Keith Thompson
@KeithThompson:的确。在没有原帖指导的情况下,我只是选择了搜索结果中出现的第一个标准。感谢提供链接。 - Eric Lippert
1
@EricLippert bool 是一个类型定义,它是一个与任何其他整数类型不同的整数类型 _Bool 的别名。true 是一个宏,它扩展为 int 类型的 1。如果您无法找到这些内容,我可以详细解释每个方面。 - M.M
@chux请参阅N1570 6.4.4.1中“整数常量”的定义及确定类型的表格。在C语言中,“integer constant”是C++所称的“integer literal”(我认为后者是更直观的术语)。我认为“整数常量1”表示1,虽然我知道你可能会寻找一些可操作空间。 - M.M
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接