bool是C的本地类型吗?
在C99标准中,可以通过包含stdbool.h头文件来直接使用bool类型。然而,在C90标准中,bool类型必须通过typedef或enum进行定义。以下是一种常见的实现方式:
typedef int bool; #define TRUE 1 #define FALSE 0 bool f = FALSE; if (f) { ... }
另一种实现方式是使用enum:
typedef enum { FALSE, TRUE } boolean; boolean b = FALSE; if (b) { ... }
需要注意的是,这种typedef的行为与C99的bool类型以及许多编译器的bit类型不同。例如,在C99中,bool x=4294967296LL;或bool x=0.1;会将x设置为1,但大多数typedef版本可能会将其设置为0。
因此,问题"Is bool a native C type?"的出现是因为在不同的C标准中,bool类型的定义方式不同,这可能会导致不同的行为。要解决这个问题,可以根据所使用的C标准选择合适的bool类型定义方式。在C99中,可以直接使用stdbool.h头文件中定义的bool类型。而在C90中,可以使用typedef或enum来定义bool类型。
bool是C语言的本地类型吗?
在当前的C语言标准中,C99中存在bool类型,但在C89/90中不存在。
在C99中,本地类型实际上被称为_Bool,而bool是一个在stdbool.h中定义的标准库宏(预期解析为_Bool)。_Bool类型的对象只能保存0或1,而true和false也是来自stdbool.h的宏。
需要注意的是,C预处理器将会将#if true解释为#if 0,除非包含了stdbool.h。与此同时,C++预处理器被要求原生地将true识别为语言字面值。
在这个回答发布之后,有一个新的ISO C标准在2011年发布。ANSI通常将ISO C11标准作为ANSI标准采纳。出于历史原因,“ANSI C”一词通常(但不正确地)指的是ANSI C89 / ISO C90标准定义的语言。由于C标准现在首先由ISO发布,并且有三个ISO C标准,采用的程度各不相同,最好用标准发布的年份(ISO C90、ISO C99、ISO C11)来避免任何混淆。
这是否意味着_Bool占用1个字节的内存?
:不是的。为什么呢?在C语言中,每个可寻址的对象至少要占用1个字节。在实际实现中,_Bool通常占用1个字节的内存。然而,语言规范明确允许将_Bool用作位字段类型,这意味着通过使用位字段,可以将_Bool值压缩到一个位中(在较大的结构体内部)。
一个_Bool值既可以是直接寻址的(即占用1个字节),也可以参与位字段吗?一个_Bool数组仍然需要所有元素都是可寻址的(例如_Bool* ptr = &boolArray[123])。
你的评论应该是一个完全独立的SO问题。
例如,在C89中,如果没有本地bool类型,条件语句和比较运算符是如何工作的?如果我写if (5 < 6),底层是否都被转换为int类型?
运算符<返回一个int值 - 零表示假,非零表示真(我认为它需要返回1,但我懒得查了)。在if中,表达式被计算,如果表达式的值非零(或指针类型的非NULL),则执行控制语句。
这在C23中发生了变化(en.cppreference.com/w/c/language/bool_constant)。