逻辑自洽地区分【左值与右值】

2024-04-22 08:28

本文主要是介绍逻辑自洽地区分【左值与右值】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

        由于不同的文章和书籍,对左值和右值的区分皆有不同,这里我只是给自己定了一个逻辑可以自洽的标准,供自己去区分左值和右值,所以本篇博客,属于一个笔记。

C++ primer对左值和右值的介绍

        C++中的表达式:要么是左值,要么是右值。而左值和右值是从C语言中继承过来的,在C语言中,为了帮助记忆,可以简单的认为左值可以位于赋值语句的左侧,右值则不能。这里其实也表达了一个隐藏的性质:左值可以被修改,右值不可以被修改

        但是在C++中,左值和右值的区分就复杂了很多,这也就是不同的文章、资料和书籍对左值和右值区分有不同的说法的原因。

        C++primer:“一个左值表达式的求值结果是一个对象或者一个函数,然而以常量对象为代表的某些左值实际上不能作为赋值语句的左侧运算对象”

        这句话的意思就是左值是一个指明对象的表达式,“常量对象不能做赋值语句的左侧运算对象”的意思就是const 左值,即使不可修改,但是依旧是左值。也就指出:左值分为可修改的左值和不可修改的左值(常量对象/const 左值)

        C++primer:“虽然某些表达式的求值结果是对象,但它们是右值而非左值”

        这句话意思,即使你的表达式结果指向的是一个对象,但是你位于赋值表达式的右侧,那这个对象就被当作右值,此时用到的是对象的值,也就是用的对象的内容,并不是这个对象。

        最后其总结了一句话:“当一个对象被用作右值时,用的是对象的值(内容);当对象被用作左值时,用的是对象的身份(对象在内存中存储的位置)”

        这也表达了一个观点:左值可以当右值使用,但是此时用的是左值指向的对象的内容,但是右值不能当左值使用,因为左值必须指明一个对象,右值压根没有指明的对象

        在了解这些之后,下面是总结的左右值的概念和区分

一、左值(可修改的左值 、不可修改的左值)

左值:用来指明一个对象的表达式,指向这个对象的内存区域,可以被取地址

        我们思考一下,左值一般用来干什么?
        我们在使用左值的时候,无非就是在赋值,将左值改变,那既然是要改变左值,就必须要求左值指明一个对象,也就必须要求左值要拥有存储空间,可以被取地址。

        (没有空间怎么改变?)

特殊情况:不可被改变的左值

        const 修饰的左值,不可被修改,不能出现在 ‘ = ’的左侧,但仍是左值

证明1

        因为左值是 有指明的对象,有存储空间且可以被取地址的,所以即使被const修饰,依旧满足上面的条件

证明2:(C++语法)

        使用左值引用与右值引用来证明

    const int x = 10;// x = 12; //虽然x不可出现在 ‘ = ’的左边// const int&& y = x;   //右值引用无法引用const int& z = x;    //左值引用可以引用,但必须是const,要保证权限
//                         从语法上证明,x仍为左值

二、右值(都不可被改变)

右值:表示一个值但不指明一个对象的表达式,不可以被取地址;如:字面常量,表达式,数组名,函数名,临时对象

数组名、函数名为右值原因:

        数组名与函数名都是地址常量,没有指明的空间存储,所以为右值;

临时对象为右值原因:

       首先要知道临时对象是如何产生的?

        临时对象一般是在 类型转换、对象拷贝的时候生成的,其任务就是将值拷贝一份,再赋值给接收对象。赋值结束后,临时对象也就销毁了,所以其生命周期的短暂,我们无法取到其地址,就认为临时对象是一个将亡值,被当作右值。

在C++11引入右值引用之后

        C++primer  提到了:“左值持久,右值短暂”的说法,也就是左值有持久的状态,右值是非持久的状态。这也正对应了上面所说的,左值可以取地址,右值不可以。因为我们没有理由去取一个即将销毁的变量的地址,是没有意义的。所以在取右值的地址时,在编译的时候也是会报错的。

        综上所述,总结了区分左右值并且逻辑自洽的观点:

        对一个变量取地址,可以通过编译,那就是左值;反之则为右值。左值可以作为右值,此时是用到的对象的值/内容,右值不能作为左值

这篇关于逻辑自洽地区分【左值与右值】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/925275

相关文章

逻辑表达式,最小项

目录 得到此图的逻辑电路 1.画出它的真值表 2.根据真值表写出逻辑式 3.画逻辑图 逻辑函数的表示 逻辑表达式 最小项 定义 基本性质 最小项编号 最小项表达式   得到此图的逻辑电路 1.画出它的真值表 这是同或的逻辑式。 2.根据真值表写出逻辑式   3.画逻辑图   有两种画法,1是根据运算优先级非>与>或得到,第二种是采

各个地区饮食结构的差异 第九篇

比如原来蛋自质吃太少了 消耗太多 亏空 太多 就会虚 所有的方案要有循证医学证据

UMI复现代码运行逻辑全流程(一)——eval_real.py(尚在更新)

一、文件夹功能解析 全文件夹如下 其中,核心文件作用为: diffusion_policy:扩散策略核心文件夹,包含了众多模型及基础库 example:标定及配置文件 scripts/scripts_real:测试脚本文件,区别在于前者倾向于单体运行,后者为整体运行 scripts_slam_pipeline:orb_slam3运行全部文件 umi:核心交互文件夹,作用在于构建真

C++中的左值(Lvalue)和右值(Rvalue)详解

C++中的左值(Lvalue)和右值(Rvalue)详解 在C++中,左值(Lvalue)和右值(Rvalue)的概念是理解表达式和变量的重要基础。为了提高C++的性能和灵活性,C++11引入了一些新的特性,如右值引用和移动语义,因此了解左值和右值的区别对于编写高效的C++代码至关重要。 1. 什么是左值和右值? 左值(Lvalue):指的是有持久存储的对象。它们的值可以被获取和修改,并且在

【Java编程的逻辑】原子变量 CAS 显示锁

原子变量 在理解synchronized中有使用synchronized保证原子更新操作,但是使用synchronized成本太高了,需要先获取锁,最后还要释放锁,如果获取不到锁还需要等到。这些成本都是比较高的,对于这种情况,可以使用原子变量。 Java并发包中的基本原子变量类型有以下几种: AtomicBoolean:原子Boolean类型,常用来在程序中表示一个标志位 AtomicIn

【Java编程的逻辑】容器类的总结

抽象容器类 用法和特点 容器类有两个根接口,分别是Collection 和 Map ,Collection表示单个元素的集合,Map表示键值对的集合 。 Collection Collection表示的数据集合有基本的增、删、查、遍历等方法,但没有定义元素间的顺序或位置,也没有规定是否有重复元素。 List: 是Collection的子接口,表示有顺序或位置的数据集合,增加了根据

【Java编程的逻辑】堆与优先级队列PriorityQueue

完全二叉树 & 满二叉树 & 堆 基本概念 满二叉树是指除了最后一层外,每个节点都有两个孩子,而最后一层都是叶子节点,都没有孩子。 满二叉树一定是完全二叉树,但完全二叉树不要求最后一层是满的,但如果不满,则要求所有节点必须集中在最左边,从左到右是连续的,中间不能有空的。 特点 在完全二叉树中,可以给每个节点一个编号,编号从1开始连续递增,从上到下,从左到右 完全二叉树有一

【Java编程的逻辑】Map和Set

HashMap Map有键和值的概念。一个键映射到一个值,Map按照键存储和访问值,键不能重复。 HashMap实现了Map接口。 基本原理 HashMap的基本实现原理:内部有一个哈希表,即数组table,每个元素table[i]指向一个单向链表,根据键存取值,用键算出hash值,取模得到数组中的索引位置index,然后操作table[index]指向的单向链表。 存取的时候依据键的

MySQL逻辑架构和执行流程(一)

MySQL逻辑架构和执行流程 MySQL逻辑架构图第一层(连接层)第二层(核心服务层)第三层(存储引擎) 各组件详细介绍ConnectorsConnection PoolSQL_InterfaceParser解析器Optimizer优化器Cache和Buffer缓存Engine存储引擎 执行流程 MySQL 逻辑架构图 第一层(连接层) 连接层不是MYSQL架构特有的,

逻辑回归与线性回归的目标函数和应用场景比较

概述 逻辑回归和线性回归是两种常用的预测模型,它们在目标函数和应用场景上存在显著差异。本文将详细比较这两种回归模型,并提供相应的代码示例。 线性回归 线性回归是一种预测连续数值的模型,其目标是找到特征( X )和目标变量( Y )之间的线性关系。线性回归的目标函数是最小化预测值和实际值之间的平方差,即均方误差(MSE)。 目标函数 线性回归的损失函数是均方误差: [ J(\theta)