布尔类型及引用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了布尔类型及引用相关的知识,希望对你有一定的参考价值。

        今天我们来学习下 C++ 中的布尔类型。说起布尔类型,有的同学可能在 C 语言中听过,0 代表假,1 代表真。我们在 C 语言中用 int 类型的数来表示布尔类型,这也是可取的。但是在 C++ 中正式引出了布尔类型这个概念,它是一种基本类型。C++ 中的 bool 可取的值只有 true 和 false,理论上 bool 只占用一个字节。注意:true 代表真值,编译器内部用 1 来表示;false 代表非真值编译器内部用 0 来表示。

        bool 类型只有 true(非0)和 false(0)两个值,C++ 编译器会将非 0 值转换为 true,0 值转换为 false。下来我们来以代码为例进行分析

#include <stdio.h>

int main(int argc, char *argv[])
{
    bool b = false;
    int a = b;
    
    printf("sizeof(b) = %d\n", sizeof(b));    // 1
    printf("b = %d, a = %d\n", b, a);        // 0, 0
    
    b = 3;
    a = b;
    
    printf("b = %d, a = %d\n", b, a);        // 1, 1
    
    b = -5;
    a = b;
    
    printf("b = %d, a = %d\n", b, a);        // 1, 1
    
    a = 10;
    b = a;
    
    printf("a = %d, b = %d\n", a, b);        // 10, 1
    
    a = 0;
    b = a;
    
    printf("a = %d, b = %d\n", a, b);        // 0, 0
    
    return 0;
}

        我们分析下,第 8 行打印 bool 类型 b 的内存大小,那么便是为 1 了。由于它初始化为 false ,所以为 0, a = b 当然也为 0 了;第 11 行 b 为非 0。所以第 14 行打印出 1, 1;第 16 行 b 为非 0。所以第 19 行打印出 1, 1;第 21 行 a 为 10,所以第 24 行打印出 10, 1;第 26 行 a 为 0,所以第 29 行打印出 0, 0啦。我们看看编译结果

技术分享图片

        因为布尔类型是 C++ 中的基本数据类型,所以我们可以定义 bool 类型的:局部变量、全局变量、常量、指针、数组 ... ; C++ 对三目运算符也进行了升级,在 C 语言中的三目运算符返回的是变量值,不能作为左值使用;但在 C++ 中,三目运算符可直接返回变量本身,所以它即可作为右值使用,又可作为左值使用。注意:三目运算符可能返回的值中如果有一个是常量值,则不能作为左值使用。

        下来我们以代码为例进行分析

#include <stdio.h>

int main(int argc, char *argv[])
{
    int a = 1;
    int b = 2;
    
    (a < b ? a : b) = 3;
    
    printf("a = %d, b = %d\n", a, b);   
    
    return 0;
}

        这段代码在 gcc 中肯定编译通不过因为三目运算符返回的是变量值,给常量赋值肯定出问题,那么在 g++ 中,它可以通过,返回的是变量本身,所以第 8 行相当于 a = 3。我们来看看编译结果

技术分享图片

        我们看到 gcc 编译直接报错,但是 g++ 编译通过,并且成功的改变了 a 的值。在这块我们就不得不提变量名了,我们之前学过变量是一段实际连续存储空间的别名;程序中通过变量来申请并命名存储空间;通过变量的名字可以使用存储空间。我们再来想一个问题:一段连续的存储空间只能有一个别名吗?在 C++ 中新增了引用的概念。那么什么是引用呢?引用可以看作一个已定义变量的别名,它的语法格式是:TYpe& name = var;注意:普通引用在定义时必须同同类型的变量进行初始化。我们以代码为例进行分析

#include <stdio.h>

int main(int argc, char *argv[])
{
    int a = 3;
    int& b = a;
    
    b = 5;
    
    printf("a = %d\n", a); 
    printf("b = %d\n", b); 
    printf("&a = %p\n", &a);
    printf("&b = %p\n", &b);
    
    return 0;
}

        我们看到在第 6 行进行了 a 的引用,也就是说, b 为 a 的别名,改变 b 的值就相当于改变 a 的值啦。我们看看编译结果

技术分享图片

        我们看到 a 和 b 都改为了 5,并且他俩的地址是一样的,也就证明了 b 是 a 的别名。那么回到之前的三目运算符的问题,当三目运算符的可能返回值都是变量时,返回的是变量引用;当三目运算符的可能返回值中有常量时,返回的是值。如下所示

技术分享图片

        通过对布尔类型和引用的学习,总结如下:1、bool 类型是 C++ 新增加的基础类型,它的值只能是 true 和 false;2、C++ 中的三目运算符可作为左值使用;3、C++ 中的引用可以看作变量的别名来使用;4、三目运算符的可能返回都是变量时,返回的是引用。


        欢迎大家一起来学习 C++ 语言,可以加我QQ:243343083

以上是关于布尔类型及引用的主要内容,如果未能解决你的问题,请参考以下文章

变量及数据类型

(转) Java中的负数及基本类型的转型详解

js值类型与引用类型

布尔类型和引用的本质

《Go语言实战》Go 类型:基本类型引用类型结构类型自定义类型

cpp(布尔类型与引用)