在 C++ 或 <stdbool.h>
下从 C99 开始,小于运算符 <
怎么样?为 boolean 值定义?
或者,解释这段代码的行为:
#ifndef __cplusplus
#include <stdbool.h>
#endif
#include <stdio.h>
int main() {
bool b = -1;
if(b < true) {
printf("b < true\n");
}
if(b < false) {
printf("b < false\n");
}
if(true < false) {
printf("true < false\n");
}
if(false < true) {
printf("false < true\n");
}
}
在MSVC 10版下,编译为C++代码,GCC 4.6.3-ubuntu5编译为C代码,G++ 4.6.3-1ubuntu5编译为C++代码,你得到的只是
false < true
即下面的不等式都是false
:
(bool)-1 < true
(bool)-1 < false
true < false
下面是true
:
false < true
最佳答案
在 C++ 中(我也怀疑在 C 中),bool
s 比较就像
false
是 0
和 true
是 1
.如果类型是 bool
, 不
true
以外的值和 false
是可能的。
比较时bool
到其他数字类型,它将转换为 int
,
再次与 false
转换为 0
和 true
转换为 1
.
编辑: C++ 和 stdbool.h
在 C99 中还强制 boolean 值为 0(假)或 1(真) - bool b = -1;
设置 b
的值至 1. 自 1 < 1
和 1 < 0
都是假的,问题中的不等式是正确的。
编辑:(詹姆斯)除了上面的编辑不是真的正确,在
至少对于 C++。一个 bool
没有值 0 或 1,它有一个值
的 false
或 true
.只有当它被提升为int
那个
转换创建 0
的值和 1
.
正如 Konrad 所指出的,与 bool
没有可比性值(value)观。
比较运算符会发生“通常的算术转换”,
这意味着对两个操作数的积分提升,这意味着
bool
转换为 int
(与 char
或 short
... 或枚举一样)。
所有这些都是相当技术性的。在实践中,你可以记住
false
< true
, 或者你可以考虑false
为 0 和 true
是 1,
哪个最适合您。唯一要记住的重要事情是
那个bool
可以有 no 其他值。
(有趣的是,我不认为 bool
的位模式是
标准规定的。实现可以使用位模式
0x55
和 0xAA
,例如,只要所有转换为
整数类型给出 0 和 1,转换为 bool
总是给
适当的值等。包括静态的零初始化
变量。)
最后一点:bool b = -1;
套 b
至-1 != 0
(这是
true
,而不是 1
,当然,true
将转换为 1
在任何
数字上下文。
关于c++ - boolean 值的排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11951729/