布尔类型和引用的本质

Posted 阿弥陀佛.a

tags:

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


C语言里面不存在真正的bool类型,0代表假,1代表真,功能上可行,但是不严谨


bool类型内部是由一个字节的整型(byte)实现的,所以支持运算
输出结果: 0 1 1

布尔类型是C++中的基本数据类型

  • 可以定义bool类型的全局变量
  • 可以定义bool类型的常量
  • 可以定义bool类型的指针
  • 可以定义bool类型的数组


用C语言编译器编译是错误的,三目运算符那一行报错,等号左边是一个值
用C++编译器编译,编译通过,打印了:a=3,b=2

修改:

编译报错,与之前C语言报的错一样,因为左边返回的是常量了。C++编译器只有在全部是变量的情况下可以作为左值!




b使用类型float&或者其他任何不是int&的类型初始化b,都会报错
如果:int& b=1,也会报错。

阶段性小结

  • bool类型是C++新增加的基础类型
  • bool类型的值只能是true和false
  • C++中的三目运算符可作为左值使用
  • C++中的引用可以看作变量的别名来使用
  • 三目运算符的可能返回值都是变量时,返回的是引用

引用的意义:


函数定义的时候不需要初始化,而在使用函数时会将外部实际变量传入函数,此时相当于引用初始化


普通引用不能初始化为常量,但是const引用却可以初始化为常量

#include <stdio.h>

void Example()
{
    printf("Example:\\n");
    
    int a = 4;
    const int& b = a;
    int* p = (int*)&b;
    
    //b = 5;//报错
    
    *p = 5;
    
    printf("a = %d\\n", a);
    printf("b = %d\\n", b);
}

void Demo()
{
    printf("Demo:\\n");
    
    const int& c = 1;
    int* p = (int*)&c;
    
    //c = 5;//报错
    
    *p = 5;//将c变量所代表的四字节的空间存储的值从1改变成5,合法操作
    
    printf("c = %d\\n", c);
}

int main(int argc, char *argv[])
{
    Example();
    
    printf("\\n");
    
    Demo();

    return 0;
}




18行 ref.r 和12行 TRef ref = { c };说明 r 是 c 的别名ref.r就是c,所以是1
sizeof( TRef )=4,为啥?解释如下:

引用的本质是指针,所以大小是个指针大小:4

#include <stdio.h>

struct TRef
{
    char* before;
    char& ref;
    char* after;
};

int main(int argc, char* argv[])
{
    char a = 'a';
    char& b = a;
    char c = 'c';

    TRef r = {&a, b, &c};

    printf("sizeof(r) = %d\\n", sizeof(r));
    printf("sizeof(r.before) = %d\\n", sizeof(r.before));
    printf("sizeof(r.after) = %d\\n", sizeof(r.after));
    printf("&r.before = %p\\n", &r.before);
    printf("&r.after = %p\\n", &r.after);

    return 0;
}


after的地址减去before的地址是8,而before本身4个字节,所以ref也是4个字节(8-4=4)
证明了:引用占用4字节空间。

#include <stdio.h>
//不要返回局部变量的引用,相当于返回局部变量的地址??
int& demo() //返回:int* const=int&
{
    int d = 0;
    
    printf("demo: d = %d\\n", d);
    
    return d;//return &d
}

int& func()
{
    static int s = 0;//不会因为函数结束而摧毁
    
    printf("func: s = %d\\n", s);
    
    return s;//return &s
}

int main(int argc, char* argv[])
{
    int& rd = demo();
    int& rs = func();
    
    printf("\\n");
    printf("main: rd = %d\\n", rd);//demo结束后,变量空间被摧毁,rd所代表的空间因为函数结束被摧毁,rd沦为野指针
    printf("main: rs = %d\\n", rs);
    printf("\\n");
    
    rd = 10;//对野指针指向的地方赋值,很危险
    rs = 11;
    
    demo();
    func();
    
    printf("\\n");
    printf("main: rd = %d\\n", rd);
    printf("main: rs = %d\\n", rs);
    printf("\\n");
    
    return 0;
}


编译,警告:demo函数返回局部变量
不管警告,运行:

小结

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

4.2Python数据类型之布尔类型

布尔类型及引用

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

js中基本数据类型与引用数据类型的本质区别

Jacva基础

基本数据类型