我提到了这个问题,其中一些答案表明bool是一个整型(ides也把它当作关键字)。
但是,没有任何答案表明cplusplus中提供的信息,cplusplus表示bool是通过添加的宏(在这种情况下,编译器可能在编译时隐式添加此头文件以允许bool)。这是的G++版本。
那么,bool到底是什么?整型关键字还是宏?
- C还是C++?请挑一个。
- @想知道两种语言的答案没有错。
- @Oleksiydobrodum:在这种情况下,我建议你问两个问题。
- @轻量级,用相同的内容问2个问题,但是"C"和"C++"字符串,听起来很傻,没有增加任何价值。你为什么学究?
- @伊米林德:这不是学究式的;这是两种不同的语言,有不同的规则(正如答案所解释的),我们不会把不同主题的多个问题放在同一个帖子里,所以!或者我们也可以问布尔函数如何在PHP、JavaScript、Perl中工作…
在C语言中,
bool是一个宏。
C中没有名为bool的内置类型或关键字,因此典型的实现分别使用标准库来实现#definetrue和false到1和0。if语句的规则是用"零"和"非零"表达式定义的,因此依赖于true和false的扩展宏定义:
[C99: 6.8.4.1/2]: In both forms, the first substatement is executed if the expression compares unequal to 0. In the else form, the second substatement is executed if the expression compares equal to 0. If the first substatement is reached via a label, the second substatement is not executed.
为了方便起见,c99增加了内置的中间类型_Bool,这种语言的实现通常是#definebool到_Bool。此类型的定义如下:
[C99: 6.2.5/2]: An object declared as type _Bool is large enough to store the values 0 and 1.
这允许与C++程序具有更大的兼容性,这可能包括使用EDCOX1×0×类型的函数声明;然而,实际上,EDCOX1(21)可能已经足够了。
在C++中,EDCOX1×0是一个内置类型和一个关键字。
你所提供的链接并没有说EDCOX1 0是C++中的宏。它说:
The purpose in C of this header is to add a bool type and the true and false values as macro definitions.
In C++, which supports those directly, the header simply contains a macro that can be used to check if the type is supported.
这是正确的。
语义上(即,在代码的"含义")中,EDCOX1(24)定义为C++中的一个整体类型EDCOX1×0。
在词汇上(也就是说,在代码中的"外观"),[C++11: 2.12/1]将其作为关键字列出。事实上,作为整型名称一部分的所有令牌也是关键字,包括(但不限于):
- int
- unsigned
- long
- bool
- short
- signed
然而,它永远不是C++中的宏。取而代之的是,你可以得到一个宏EDCOX1(33),你可以在多语言代码中使用它来切换bool,这取决于你是在C还是C++中工作,我不确定我能想出一个有用的例子,请注意。
- 即使在我的问题中,我也不会说"BooL是C++中的宏":-)。我想知道它是如何治疗的。很好,你提供了标准参考。
- 在C++中,BoOL是一个宏定义为BoL(关键字)。"假"定义为"假","真"定义为"真"。谁在乎?我是因为我的IDE将bool设置为宏而不是关键字,因为…(这很难看)我能访问真正类型的唯一方法是使用undef
- @温特:这不是真的;一些代码/库/头/实现正在这样做。一个EDCOX1,0,EDCOX1,1,EDCX1,2的程序实际上有未定义的行为(虽然我可以粗略地想象一个蹩脚的STDLIB实现它),所以它肯定不是关于"C++"的东西。
- BoundaryImposition在StdBoo.h中完成,它表示"支持C++中的StdBoo.H>是GCC扩展"。我的设置没有什么奇怪的地方,在Debian上使用GCC4.9.2。
- @温特:是的,所以C头只作为stdlib实现的扩展包含。与C++无关。只是不要使用头部,你会没事的。
- 很高兴知道原子序数h包括原子序数。
在c bool中,是从stdbool.h扩展到c布尔类型的_Bool的宏。
- 只有在C99之后。在此之前,C中没有任何布尔类型。此外,EDCOX1×3是数字的,这可能不是来自C++的期望值。实际上,_Bool不是"布尔类型";它只是一个足够大的数字类型,可以同时存储1和0。
- @LightnessRaceSinorbit我尊重C术语,它在C标准中将_Bool称为布尔类型。
- 6.1.3.2以"布尔型"为标题,但只讨论转换:When any scalar value is converted to _Bool, the result is 0 if the value compares equal to 0; otherwise, the result is 1.,它是一种通过任何常规逻辑的仿布尔型。
- @它是为什么被称为布尔型的原因。它是整数类型,但转换的行为与其他整数类型不同。例如,(bool) 0.5是1,而(char) 0.5或(int) 0.5是0。术语boolean type也在7.18 boolean type中引用,标准中的值。
So what exactly the bool is? A an integral type keyword or a macro?
在C++中,它被称为布尔文字,它是内置类型。
2.2.7
类型bool、char、char16_t、char32_t、wchar_t和有符号和无符号整数类型统称为整型。
2.2.6
布尔字面常数
1 2 3
| boolean-literal:
false
true |
布尔文本是关键字false和true。这些文本是prvalues,类型为bool。
3.3.1.1.6
Values of type bool are either true or false. [ Note: There are no signed, unsigned, short, or long
bool types or values. — end note ] Values of type bool participate in integral promotions (4.5).
在c _Bool中是一个类型,bool中,true和false是stdbool.h中定义的宏。
ISO C11标准状态(第6.2.5节类型)
An object declared as type _Bool is large enough to store the values 0 and 1.
stdbool.h定义了4个宏。
bool,扩展到_Bool。
true扩大到1。
false扩大到0。
__bool_true_false_are_defined扩大到1。
在C中,没有像布尔变量这样的概念,是的,像Java、C语言等高级语言为我们提供了声明布尔变量的工具,我们用它来标记目的,以将其设置为真或假。
但是你可以用积分来实现这个,就像我们在C中做的那样。
1 2 3 4 5 6 7 8
| if(1)
{
// Because C treats 1 and any other integer as true
}
if(0)
{
// This time our if condition will result in false
} |
- 在C语言中,有一个_Bool类型,并且在头中定义了文本常量true和false。而在C语言中,比较运算符正式产生一个int,这种语言的设计是为了让您可以在它中进行编程,就像它是一个真正的布尔类型一样;至少30年来,这种做法或多或少是被推荐的。
- 我真的很惊讶,谢谢詹姆斯,我从来不知道。
- 如果其他人对C语言中的布尔变量有疑问,请访问-stackoverflow.com/questions/1921539/using boolean values in-‌&8203;c这只意味着您不能直接生成bool变量,您需要使用typedef关键字定义它,因此答案是因为我们可以使用define true定义它,而在其他语言中,它也是一个keyw奥德。
- 你读过答案了吗?如果你包括EDCOX1,7,你可以使用EDCOX1,8,EDCOX1,4,EDCOX1,5,和C++一样精确。从形式上讲,它们是不同的,但是在正常使用时,这些差异不会影响代码。
- 是的,谢谢詹姆斯
在C++ EDCOX1中,0是一个内置的数据类型。在C中不是,所以如果您在C中使用bool,那么它已经实现为typedef或#define,并且true和false必须实现为#define,或者可能是常量。