最近更新于 2023-02-08 00:35

环境

系统:Debian 11 arm64
编译:

  • C 语言:编译器 gcc 10.2.1;编译标准 C17;参数:-std=c17 -no-pie -Wall -Werror=return-type -Werror=address -Werror=sequence-point -Werror=format-security -Wextra -pedantic -Wimplicit-fallthrough -Wsequence-point -Wswitch-unreachable -Wswitch-enum -Wstringop-truncation -Wbool-compare -Wtautological-compare -Wfloat-equal -Wshadow=global -Wpointer-arith -Wpointer-compare -Wcast-align -Wcast-qual -Wwrite-strings -Wdangling-else -Wlogical-op -Wconversion -g -O0
  • C++:编译器 g++ 10.2.1;编译标准 C++20;参数:-std=c++20 -no-pie -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Werror=format-security -Wextra -pedantic -Wimplicit-fallthrough -Wsequence-point -Wswitch-unreachable -Wswitch-enum -Wstringop-truncation -Wbool-compare -Wtautological-compare -Wfloat-equal -Wshadow=global -Wpointer-arith -Wpointer-compare -Wcast-align -Wcast-qual -Wwrite-strings -Wdangling-else -Wlogical-op -Wconversion -g -O0

正文

C99 标准中增加了 _Bool 类型,并在 C23 中移除(见下图)。不过我这里使用的 gcc 编译器版本目前还不支持最新的 C23,这里没法测试。
file
C 语言中如果包含了 stdbool.h,那么就可以使用 bool 类型(看上面的表,C23 应该就是用 bool 完全替代 _Bool),另外可以使用 true 代表真,false 代表假
关于我这里的 gcc 编译器这部分的定义为
file
看 stdbool.h 中的定义,true 就是 1,但是实际使用中非零数都是视为 true。

#include <stdio.h>
#include <stdbool.h>

void printBool(bool isTrue)
{
    if (isTrue)
    {
        printf("真\n");
    }
    else
    {
        printf("假\n");
    }
}

int main()
{
    printf("bool 大小 %zd\n", sizeof(bool));

    bool a = 3;
    printBool(a);

    bool b = 2;
    printBool(b);

    bool c = 0;
    printBool(c);

    bool d = true;
    printBool(d);

    bool e = false;
    printBool(e);

    _Bool f = false;
    printBool(f);

    return 0;
}

file

而在 C++ 中,使用 bool 不需要包含特定头文件,这个应该是直接作为基本类型实现的。

#include <iostream>

void printBool(bool isTrue)
{
    if (isTrue)
    {
        std::cout << "真" << std::endl;
    }
    else
    {
        std::cout << "假" << std::endl;
    }
}

int main()
{
    std::cout << "bool 大小 " << sizeof(bool) << std::endl;

    bool a = 3;
    printBool(a);

    bool b = 2;
    printBool(b);

    bool c = 0;
    printBool(c);

    bool d = true;
    printBool(d);

    bool e = false;
    printBool(e);

    return 0;
}

file

在 C 语言和 C++ 中,这里看到的 bool 类型大小都是 1 字节,和 char 一样。而且前面的赋值操作时给了 0 和 1 以外的数字,编译的时候也没有错误或警告。
于是我尝试了给 bool 类型自增和自减

C 语言

#include <stdbool.h>

int main()
{
    bool a = true;
    ++a;
    --a;

    return 0;
}

file

由 -Wbool-operation 参数给出了警告,但是正常编译

C++

int main()
{
    bool a = true;
    --a;
    ++a;

    return 0;
}

file

而在 C++ 中则直接对这种操作报错,其中又有所区别,自减是直接报错的,而自增指出了是 C++17,那应该就是从 C++17 标准开始禁止这种用法的