C++左值和右值学习笔记

 更新时间:2023年10月31日 09:13:06   作者:Totn  
这篇文章主要为大家介绍了C++左值和右值学习笔记的重点讲解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

来看一行简单的代码

int a = 10;

这行代码,"=" 左边就是左值,"="右边的则为右值,那他们到底有什么不同呢?

如果是Java、PHP等后端同学,会称以左边的"a"为变量,右边的"10"为字面量,而到了C++这里,我们就需要对他理解更多一点。

这行代码运行起来,是在系统内存中申请了一块空间,命名为"a",然后把"10"这个值装入了这个单内存空间中,内存中的空间是有地址的,并且和"a"这个名字绑在一起,当我们提到"a",就能知道他所代表的内存地址,这也是所谓的"可寻址"。

在C++中,每个表达式都具有一个值和一个类型。左值和右值描述了表达式的可寻址性和持久性。

首先,让我们来看一下左值的概念。左值是指可以被取地址的表达式,或者说具有标识符的表达式。左值表示一个内存位置,它具有持久性,可以在程序的不同部分访问和修改。简而言之,左值可以出现在赋值运算符的左边。

左值的特点

int x = 10;     // 'x' 是一个左值,可以被赋值
int* p = &x;    // '&x' 是一个左值,可以取其地址
int arr[5];     // 'arr' 是一个左值,可以被访问和修改

接下来,我们来看一下右值的概念。右值是指不可被取地址的表达式,或者说临时生成的表达式。右值表示一个临时的值,它通常只能用于赋值或传递给函数,没有持久性。简而言之,右值可以出现在赋值运算符的右边。

右值的特点

int a = 5;              // '5' 是一个右值
int b = a + 3;          // 'a + 3' 是一个右值
int* ptr = new int(10); // 'new int(10)' 返回一个右值

需要注意的是,C++11引入了右值引用的概念,即可以对右值进行引用的类型。右值引用允许我们更有效地管理资源,如移动语义和完美转发。

综上所述,左值表示持久的可寻址表达式,而右值表示临时的不可寻址表达式。理解左值和右值的概念对于理解C++中的赋值、函数调用和参数传递等操作是非常重要的。

函数返回值

那么,一个函数返回值,应该是左值还是右值?

当一个函数被调用时,它会在栈上创建一个新的帧来存储该函数的局部变量、参数以及其他信息。该帧在函数返回时销毁。

因为函数返回值通常是通过寄存器或者特殊寄存器(如eax)返回的,它们的地址在栈帧被销毁后就不能再访问了。所以不能直接对函数返回值取址。

但是,如果你需要返回一个指向已经存在的内存块的指针,然后在函数外使用该指针访问内存块,那么是可以的。例如:

int* foo() {
    int x = 10;
    return &x;
}

int main() {
    int* p = foo();
    std::cout << *p; // undefined behavior
    return 0;
}

上述代码中的foo()函数返回了一个指向局部变量x的指针。

这会导致undefined behavior,因为x在函数返回时就被销毁了,所以p指向的内存块中可能包含任意的值。

所以,不能直接对函数返回值取址,函数返回值是一个右值。

但如何函数返回的是指向已经存在的内存块的指针,即不是函数内定义的东西,那么取址是没有问题的。

以上就是C++左值和右值学习笔记的详细内容,更多关于C++左值 右值的资料请关注脚本之家其它相关文章!

相关文章

  • C++ 中lambda表达式的编译器实现原理

    C++ 中lambda表达式的编译器实现原理

    C++ 11加入了一个非常重要的特性——Lambda表达式。这篇文章主要介绍了C++ 中lambda表达式的编译器实现原理,需要的朋友可以参考下
    2017-02-02
  • C语言循环控制入门介绍

    C语言循环控制入门介绍

    大家好,本篇文章主要讲的是C语言循环控制入门介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2022-01-01
  • C++11中的引用限定符示例代码

    C++11中的引用限定符示例代码

    C++中有左值和右值的概念,其实,左值和右值的区分也同样适用于类对象,本文中将左值的类对象称为左值对象,将右值的类对象称为右值对象,对C++11 引用限定符相关知识感兴趣的朋友跟随小编一起看看吧
    2023-01-01
  • Qt C++实现录屏录音功能的示例详解

    Qt C++实现录屏录音功能的示例详解

    实现一个录屏+录音的功能且需要快速开发,Qt无疑是一个非常好的选择。他有丰富的类库和接口可以很好的满足开发需求。本文就来和大家聊聊具体的实现方法吧
    2023-03-03
  • C语言使用结构体实现简单通讯录

    C语言使用结构体实现简单通讯录

    这篇文章主要为大家详细介绍了C语言使用结构体实现简单通讯录,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • C语言预处理详解

    C语言预处理详解

    这篇文章主要给大家介绍了关于C语言之预处理的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-10-10
  • C++实现LeetCode(138.拷贝带有随机指针的链表)

    C++实现LeetCode(138.拷贝带有随机指针的链表)

    这篇文章主要介绍了C++实现LeetCode(138.拷贝带有随机指针的链表),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • C/C++经典实例之模拟计算器示例代码

    C/C++经典实例之模拟计算器示例代码

    最近在看到的一个需求,本以为比较简单,但花了不少时间,所以下面这篇文章主要给大家介绍了关于C/C++经典实例之模拟计算器的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-10-10
  • C语言实现餐厅点餐系统

    C语言实现餐厅点餐系统

    这篇文章主要为大家详细介绍了C语言实现餐厅点餐系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • C++ 学习之旅三 我和超级玛丽有个约会

    C++ 学习之旅三 我和超级玛丽有个约会

    学习了c++有一周有余了吧,感谢孙鑫老师的视频教程,让我 对C++有了基本的了解,并理解到C++与.net 的许许多多的区别,更要感谢网民为programaking的人,会为我提供了超级玛丽制作揭秘 这套宝贵的教程,让我 做做出了这个项目,对c++ 有了一个更深层次的认识。我就把我做超级玛丽这个游戏的心得,体会写成博客分享给大家把
    2012-11-11

最新评论