布尔类型和引用的本质

本文探讨了C++中的bool类型及其在表达逻辑时的使用,指出其与C语言的区别。同时,详细阐述了引用的概念,包括作为左值、初始化规则以及在函数参数传递中的作用。通过示例代码展示了引用如何作为函数参数和变量别名,并讨论了引用与指针的内存占用。此外,还提到了局部变量引用的潜在风险,并给出了相关警告和运行结果。
摘要由CSDN通过智能技术生成

在这里插入图片描述
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函数返回局部变量
不管警告,运行:
在这里插入图片描述
小结
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值