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

前言

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

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.mzph.cn/pingmian/1675.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

运营商三要素核验接口-手机实名验证API

运营商三要素核验接口是一种API(Application Programming Interface,应用程序编程接口),主要用于通过互联网技术对接通信运营商的实名制数据库,以验证用户提供的手机号码、身份证号码、姓名这三项关键信息(…

Python | Leetcode Python题解之第37题解数独

题目: 题解: class Solution:def solveSudoku(self, board: List[List[str]]) -> None:def dfs(pos: int):nonlocal validif pos len(spaces):valid Truereturni, j spaces[pos]for digit in range(9):if line[i][digit] column[j][digit] bloc…

jmeter 指定QPS压测接口

文章目录 jmeter 指定QPS压测接口更换语言为中文创建测试任务新建线程组右键线程组,新建http request,填写要你要压测的接口地址、参数如果需要自定义请求头,添加一个Http头信息管理器要查看结果和QPS统计数据,给上门的http请求添…

算法库应用-有序单链表插入节点

学习源头: 模仿贺利坚老师单链表排序文章浏览阅读5.9k次。  本文针对数据结构基础系列网络课程(2):线性表中第11课时单链表应用举例。例:拆分单链表 (linklist.h是单链表“算法库”中的头文件,详情单击链接…)//本程…

VForm3的文件上传方式

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio 演示地址:RuoYi-Nbcio后台管理系统 http://122.227.135.243:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a…

“转义字符”知多少

有一些不容易直接表示的字符,最典型的是“换行符”,要表示这样的字符就需要用到“转义字符”。 严格来讲,转义字符(Escape character)专指反斜杠 \。 在C语言中,以反斜杠 \ 开头,后面跟一个或…

AI电销机器人系统源码部署:freeswitch安装Windows

在 Windows 上安装 FreeSWITCH 可以通过以下步骤完成: 下载安装文件: 访问 FreeSWITCH 官方网站(https://freeswitch.org/)并下载适用于 Windows 的安装程序。 运行安装程序: 打开下载的安装程序,并按照提…

第三届 SWCTF-Web 部分 WP

写在前面 题目主要涉及的是前端 php 内容知识,仅以本篇博客记录自己 Web 出题的奇思妙想。 Copyright © [2024] [Myon⁶]. All rights reserved. 目录 1、HTTP 2、再见了晚星 3、myon123_easy_php 4、baby_P0P 5、LOGIN!!! 1、HTTP 首页文件默认就是 ind…

《大话西游2》本人收集的十二个单机版游戏,有详细的视频架设教程,云盘下载

《大话西游2》是一款经典的大型多人在线角色扮演游戏,也是一款国风经典的游戏。 有能力的可以架设个外网,让大家一起玩。 《大话西游2》本人收集的十二个单机版游戏,有详细的视频架设教程,值得收藏 下载地址: 链接&…

半导体制造工艺之分类浅述

半导体制造工艺分为逻辑制程(也叫逻辑工艺)和特殊制程(也叫特色工艺)。 1、逻辑工艺概述 随着集成电路行业沿着摩尔定律不断发展,晶体管数量增加的同时,工艺节点不断缩小。先进逻辑工艺是相对的概念,2005年全球先进逻辑工艺的工艺节点在65/55纳米,现在则变为3纳米。中…

关于前端的那些知识点

1.CommonJs和Es6(ECMAScript 6 )模块化的相同点和不同点 // 相同点: // ---对引入的对象赋值,即对象内部的值的改变// 不同点: // 1.CommonJs require模块运行时加载,而Es6模块编译时输出接口 // 2.CommonJs require模块同步加载(排队加载),而es6模块异步加载(就是同时…

人人可拥有刘强东同款数字人分身!

每个人都可以拥有东哥同款数字人分身直播间进行直播带货,怎样克隆自己的数字人形象? 青否数字人克隆源码的克隆效果媲美真人: 仅需将真人录制的2-6分钟视频上传至克隆端后台,系统便会自动启动自动克隆。3-5小时后,即可…

学习微服务nacos遇到的问题

在学习微服务注册到nacos的时候&#xff0c;所有过程都正确了&#xff0c;注册也成功了&#xff0c;但是访问不了调用的地址报错出现问题。 一、引入依赖 在cloud-demo父工程的pom文件中的<dependencyManagement>中引入SpringCloudAlibaba的依赖 1、springboot <pa…

数据安全:口令

数据安全&#xff1a;口令 概念 在数据安全和网络安全领域中&#xff0c;口令&#xff08;或密码&#xff09;的安全性至关重要。其中&#xff0c;弱口令和强口令是两个核心概念&#xff0c;它们分别代表了不同级别的密码安全性。 弱口令通常指的是那些容易被猜测或破解的密…

森林消防装备:高压消防接力水泵/恒峰智慧科技

在广袤无垠的森林中&#xff0c;每一份绿色都是大自然赋予我们的宝贵财富。然而&#xff0c;这些美丽的绿色也可能因为一场突如其来的火灾而被瞬间吞噬。为了保护这片生命的绿洲&#xff0c;我们需要一种高效、可靠的消防装备——高压消防接力水泵。 这款森林消防装备采用本田汽…

常规文件怎么做成二维码?扫描二维码就能在线看文件

现在可以将文件做成活码二维码之后&#xff0c;通过扫描二维码的方式来查看文件内容&#xff0c;部分二维码也可以扫码下载文件&#xff0c;从而实现文件在其他人之间的快速传播。 文件二维码的制作原理是将文件上传到云端之后&#xff0c;生成单独的链接转换成二维码&#xf…

皮带跑偏AI巡检系统 砂石、煤矿、物流场景下的皮带跑偏自动检测

在工业生产中&#xff0c;皮带传动系统被广泛应用于输送、运输和生产线等领域。然而&#xff0c;皮带跑偏是一个普遍存在且隐患严重的问题。一旦皮带跑偏&#xff0c;不仅会造成设备损坏、生产中断&#xff0c;还可能引发严重的安全事故&#xff0c;甚至导致人员伤亡。目前常见…

vue3项目使用<img :src=““ />动态加载图片

分享一下使用<img :src"" />动态加载图片时遇到的问题以及解决方法。 下面是部分页面代码&#xff0c;这里我使用了<img :src"itemc.headUrl" />来动态加载图片 这时遇到了问题&#xff0c;因为这里的itemc.headUrl是图片的相对路径&#xff…

Maven 杂记

pom.xml中的一些注意点 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.…

P450焕新而来,室内外两用+路径规划+YOLO点击跟踪,算力高达100TOPS

Prometheus 450&#xff08;简称P450&#xff09;是一款室内室外两用的中型轴距&#xff08;410mm&#xff09;无人机&#xff0c;基于F450基础飞行平台&#xff0c;搭载感知传感器二维平面激光雷达&#xff0c;双目深度相机等&#xff0c;配合软件Prometheus自主无人机系统和S…