c++ - boolean 值的排序

标签 c++ c boolean comparison-operators

在 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 比较就像 false0true1 .如果类型是 bool , 不 true 以外的值和 false是可能的。

比较时bool到其他数字类型,它将转换为 int , 再次与 false转换为 0true转换为 1 .

编辑: C++ 和 stdbool.h在 C99 中还强制 boolean 值为 0(假)或 1(真) - bool b = -1;设置 b 的值至 1. 自 1 < 11 < 0都是假的,问题中的不等式是正确的。

编辑:(詹姆斯)除了上面的编辑不是真的正确,在 至少对于 C++。一个 bool没有值 0 或 1,它有一个值 的 falsetrue .只有当它被提升为int那个 转换创建 0 的值和 1 .

正如 Konrad 所指出的,与 bool 没有可比性值(value)观。 比较运算符会发生“通常的算术转换”, 这意味着对两个操作数的积分提升,这意味着 bool转换为 int (与 charshort ... 或枚举一样)。

所有这些都是相当技术性的。在实践中,你可以记住 false < true , 或者你可以考虑false为 0 和 true是 1, 哪个最适合您。唯一要记住的重要事情是 那个bool可以有 no 其他值。

(有趣的是,我不认为 bool 的位模式是 标准规定的。实现可以使用位模式 0x550xAA ,例如,只要所有转换为 整数类型给出 0 和 1,转换为 bool总是给 适当的值等。包括静态的零初始化 变量。)

最后一点:bool b = -1;b-1 != 0 (这是 true ,而不是 1 ,当然,true将转换为 1在任何 数字上下文。

关于c++ - boolean 值的排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11951729/

相关文章:

r - 如何按行获取非零元素的均值,改变条件使用的列

c - 如何计算 2 个图像中相同元素之间的像素距离

python - 在 boolean 值 Python 列表上使用列表理解时出现意外结果

c++ - 为什么当我使用头文件和与类同名的 cpp 文件创建类时,类会出错

c++ - 为什么字符串文字中的值会发生变化

c - malloc 可以分配的最大内存

c - 使用系统调用打印文件系统上的所有文件

javascript - JS生成随机 boolean 值

C++ ostream 重载不起作用

c++ - 确定与 std::function<R(T1,T2)> 兼容的函数类型集的规则?