首页 > 编程语言 >左值、左值表达式、左值引用 C++

左值、左值表达式、左值引用 C++

时间:2023-04-26 09:44:15浏览次数:31  
标签:右值 int 左值 C++ ++ 引用 表达式

 

本文topics

什么是左值和右值
什么是左值表达式、右值表达式
引用的分类
之前学习Java的时候只记得在赋值表达式左边的就是左值,右边的就是右值。这个说法没有错,但今天又在C++中有学习到了关于左右值得概念,在此梳理了一些这些知识点。

左值和右值
左值:左值是一个对象或变量,可以代表着一个固定地址。

int i = 1;//此时,i是个变量,本质和对象一样,是一块内存区域,代表着一个固定的地址。
1
右值:不能作为左值的都是右值,要么是一个常量,要么就是一个使用一次立即被销毁的临时变量或临时对象,右值没有固定的地址,使用完立即被释放。

int i = 1 ; //1 是一个右值,没有固定地址,虽然它也占内存,但用完就被立即释放
1
这里必须再提醒一下,左值也可以同时拥有右值属性,但反过来不行。

i =i+5;//这里右边的虽然是个左值,但在这里有右值属性,可以理解为取出i的值和1相加构成一个值为(x+1)的常数(或者说临时变量)
1
了解了什么是左值和右值,那么哪些地方可以用到呢?
这里举介个常见运用左值的运算符的例子
这些运算符都必须运用左值,无法用右值来运算。这里举几个常见的例子

赋值运算符的左侧必须是左值,这个不用说应该都能理解
取值符号&
int i = 1;
int* ptr = &i;//这里i必须是个左值
1
2
容器的下标 [ ]
string s=“daily coding";
cout<<s[1]<<endl;//这里下标运算符的左边必须是左值
1
2
++,- -等。这里有统一方法可以看一个运算符是不是必须用左值。就是看这个运算符能不能操作字面值,如果不可以,就是左值运算符。
3++;//错误,这种直接操作一个字面量显然不行,所以++是必须运用左值的运算符
1
左值表达式和右值表达式
这个很好理解,一个表达式的求值结果如果是左值,就是左值表达式,否则如果是右值,就是右值表达式

int i = 1;
++i = i+2;
//这里左边++i,是返回一个i的变量,但i的值增加了1,所以是左值表达式
//这里i+1是一个右值表达式 ,因为它是一个存了3的临时地址,赋值给i++后就被释放了。

i++ = i + 2;//错误,因为i++是一个右值表达式,这里可以理解为 有一个临时对象temp=i;i = i+1;然后返回temp,结果就等于 1 =i+1;所以显然不行
1
2
3
4
5
6
引用分类

左值引用
即绑定到左值的引用,必须绑定左值
int i = 1;
int &ref = i;//这里ref是绑定了i这个左值的引用
int &ref2 = 3;// 3 是右值,无法绑定
1
2
3
右值引用
右值引用的作用是给开发者提供一个想要可以绑定临时变量的作用,可以通过右值引用符号“&&” 来实现
int &&i=1;//右值引用可直接引用右值,可以理解为想要给 “ 1 ”一个固定的地址,并给与一个变量名i
i = 3;//可以通过i再赋值
1
2
Const常量引用,本质上也是左值引用的一种,但区别有二
一是无法通过这个引用改变引用地址的值,二是它可以间接绑定右值(实际上是绑定了一种左值)
int i = 1;
const int &ref = 1;
i = 10;//错误,无法再赋值 ,因为ref是一个常量引用

const int &ref2 = 100;//可以引用一个右值,本质上是将100转换为一个变量,再将ref2引用到这个变量上
1
2
3
4
5
总结

左值是一个对象或变量,代表一个固定地址,而没有固定地址的临时对象或临时变量既是右值,不能代表一个固定地址
左值表达式就是一个值为左值的表达式,右值表达式就是值为右值的表达式
左值引用只能引用左值,右值因为只能引用右值,而const引用就可以同时引用左值和右值(通过临时变量间接引用右值,实际上是左值引用)
————————————————
版权声明:本文为CSDN博主「ShawnLyf」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43515966/article/details/93617383

 

标签:右值,int,左值,C++,++,引用,表达式
From: https://www.cnblogs.com/im18620660608/p/17354724.html

相关文章

  • C++数据结构(树)
    树是一种递归定义的数据结构,如果树中节点的各子树从左到右是有次序的,不能互换,则称该树为有序树,否则叫无序树。关于树的节点:节点拥有的子树的个数叫做节点的度如果度为0,那么该节点叫做叶节点或终端节点,除了根节点外的分支节点称为内部节点树的度是各节点度的最大值。节点的子......
  • C++ 多线程并发
    C++参考手册-并发支持库《C++ConcurrencyinAction》https://segmentfault.com/a/1190000040628584?utm_source=sf-similar-articlehttps://zhuanlan.zhihu.com/p/547312117bilibiliC++多线程并发基础入门教程1创建线程C++11之前原生不支持多线程,C++11起逐步引......
  • 正则表达式(补
    1.限定符a*:表示a重复0次及以上a+:表示a重复1次及以上a?:表示a重复0次或1次a{n}:表示a重复n次a{n,}:表示a重复n次或更多次a{n,m}:表示a重复n到m次注:如果需要判断字符串的重复:(字符串)限定符2.或运算符"|"eg.a(cat|dog):匹配的字符串是acat或adog3.字符类我们想匹配由a、b、c......
  • 用Winsock编写服务端和客户端 (C++)
      在这里先向大家推荐一本不错的入门书籍——《TCPIP网络编程》(尹圣雨著),这本书比较贴近实战,是一本不错的网络编程方向的指导用书。如果需要PDF版本,可以后台私信我! 回归正题,我们欲要使用C++实现一个简易的服务端和客户端控制台程序。代码如下:  服务端:/***************......
  • C++第四章课后习题4-12
    定义一个datatype类,能处理包含字符型,整形,浮点型3种类型的数据,给出其构造函数。1#include<iostream>2usingnamespacestd;34classDataType{5private:6chara;7intn;8floatx;9enum{10character,11intege......
  • PTA1004 成绩排名(C++)
    一、问题描述:读入 n(>0)名学生的姓名、学号、成绩,分别输出成绩最高和成绩最低学生的姓名和学号。输入格式:每个测试输入包含1个测试用例,格式为第1行:正整数n第2行:第1个学生的姓名学号成绩第3行:第2个学生的姓名学号成绩.........第n+1行:第n个学生的......
  • c++打卡第十五天
    一、问题描述 二、设计思路。①、我们在此使用结构体定义结构体数组,结构体数组中包括每个阶段的征税始末,以及相对应的税率。当我们将工资传入时,会出现相应阶段的部分,以及总共应需缴纳金额。②、我们设计计算函数,通过for循环进行计算各个阶段的计算,同时使用选择语句,判断工资是......
  • C++每日打卡
    计算年龄问题定义一个Birthday类,其成员变量有3个整形变量(出生的年月日):year,month,day;提供构造方法对这3个成员变量进行初始化;成员函数有getAge(),其功能是实现计算到2017年12月25日时该Birthday对象的年龄。 #include<iostream>usingnamespacestd;classBirthday{int......
  • C++基础3: 引用
    前言本篇首先回顾指针的概念,用C指针的缺陷引出C++中的引用,然后对引用进行说明比如,什么是引用?引用解决指针什么问题?引用的特性和使用等等1.指针什么是指针指针是内存单元的地址,口语中的指针实际上是指针变量,存储地址的变量#include<stdio.h>intmain(){ i......
  • C++中什么是多态,多态需要满足什么条件,怎么使用,它的实现原理是什么?
    概念:多态是指一个接口,根据传入的参数不同,呈现多种多态,多态分为静态多态和动态多态。静态多态:像函数重载和运算符重载属于静态多态,复用函数名。它的函数地址在编译阶段就已经确定了。动态多态:通过派生类和虚函数实现运行时多态(有子类继承,子类重写父类虚函数),它的函数......