为什么C使用单词_Bool
来定义布尔值?虽然他们使用float
这个词来表示花车而不是_Float
?
此外,为什么必须包含bool
,为什么不是基本功能的一部分,例如float
?
答案 0 :(得分:19)
_Bool
最初不是在C中,而是在1999 C标准中添加。如果它被称为bool
,那么大量现有代码将会中断,因为许多项目已经创建了自己的类型别名bool
。
C89标准预留了以_
开头的标识符,后跟大写字符作为实现使用保留。这就是添加到C的新功能始终以这些名称开头的原因。 _Complex
,_Alignof
和_Static_assert
是其他示例。
还有一个标题<stdbool.h>
,它将bool
别名为_Bool
并定义true
和false
;新标题或未定义bool
的项目可以包含此标题。
答案 1 :(得分:1)
至于......
此外,为什么必须包含
bool
,为什么不包括float
基本功能,如stdbool.h
?
...我发现虽然您需要包含bool
来获取bool
,但这是一个方便和C ++兼容性功能,不是必需的。 _Bool
是_Bool
的别名,在C99及更高版本中,您自动0
,但即使这是非必要的。在C中,任何整数或指针值都可以解释为布尔值,NULL
或_Bool
被解释为false,所有其他值被解释为true。这就是从一开始就在C中处理布尔值的方法,它仍然适用于符合最新标准的实现。
实际上,类型then
本身只是这种行为的特例:它是一个整数类型,其最小要求是它能够表示值0和1.在布尔上下文中,它起作用与任何其他整数类型一样。
答案 2 :(得分:0)
C最初没有布尔类型,它是在1999年版本的语言(C99)中添加的。此时,C ++已经标准化(在1998年)使用类型bool
,关键字false
和true
。为了使C布尔类型与C ++中的布尔类型分开,并防止新名称破坏旧的C代码,它被命名为_Bool
。
使用下划线后跟大写字母命名的原因是因为7.1.3中已经保证编译器,库或用户代码中不存在这样的标识符:
所有以下划线开头且以大写字母或其他下划线开头的标识符始终保留供任何使用。
“保留用于任何用途”,意为保留用于C语言的未来版本。
因此,自C99以来添加到该语言的所有新语言关键字都以下划线命名,后跟首字母大写。 C99中的其他示例包括_Complex
和_Imaginary
类型。
对于需要与C ++进行代码兼容的情况,创建了标题<stdbool.h>
。它包含宏bool
,扩展为_Bool
。以及扩展为false
和true
的宏0
和1
。
虽然注意到布尔语没有完全集成在C语言中,因为它们在C ++中。在C ++中,a == b
之类的表达式给出类型为bool
的结果,值为true或false。在C中,它给出类型为int
的结果,值为1或0.这是出于向后兼容的原因,使用旧的C代码。