左值和右值的区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了左值和右值的区别相关的知识,希望对你有一定的参考价值。

左值与右值
按字面意思,通俗地说。以赋值符号 = 为界,= 左边的就是左值,= 右边就是右值。 比如:(1) int b = 3;(2) int a = b;第(2)行代码,a为左值,b为右值。

更深一层,可以将 L-value 的 L, 理解成 Location,表示定位,地址。将 R-value 的 R 理解成 Read,表示读取数据。现在的计算机数据放在内存。内存有两个很基本的属性:内存地址和内存里面放的数据。想象完全一样的箱子。每个箱子有个编号,用来区分到底是哪个箱子,箱子里面可以放东西。内存地址相当于箱子的编号,内存的数据,相当于箱子里面放的东西。

变量名编译之后,会映射成内存地址。看看a = b的含义。其实就是 将 "b地址内存里面的数据",放到"a地址内存"中。

中文名
左值与右值
外文名
lvalue and rvalue
快速
导航
案例列举

应用注意
左值右值基本信息
C/C++语言中可以放在赋值符号左边的变量,即具有对应的可以由用户访问的存储单元,并且能够由用户去改变其值的量。左值表示存储在计算机内存的对象,而不是常量或计算的结果。或者说左值是代表一个内存地址值,并且通过这个内存地址,就可以对内存进行读并且写(主要是能写)操作;这也就是为什么左值可以被赋值的原因了。相对应的还有右值:当一个符号或者常量放在操作符右边的时候,计算机就读取他们的“右值”,也就是其代表的真实值。简单来说就是,左值相当于地址值,右值相当于数据值。右值指的是引用了一个存储在某个内存地址里的数据。
案例列举
比如: int ia,ib;
ib=0;
ia=ib;
在这里,首先定义ia,ib。然后对ib赋值,此时计算机取ib的左值,也就是这个符号代表的内存位置即内存地址值,计算机取0的右值,也就是数值0;然后给ia赋值为ib,此时取ib的右值给ia的左值;
所以说,ib的左值、右值是根据他的位置来说的;
这也算是形式语言的一个有意思之处吧。
应用注意
左值右值翻译:
L-value中的L指的是Location,表示可寻址。Avalue (computer science)that has an address.
R-value中的R指的是Read,表示可读。in computer science, a value that does not have an address in a computer language.
左值和右值是相对于赋值表达式而言的。左值是能出现在赋值表达式左边的表达式。左值表达式可以分为可读写的左值和只读左值。右值是可以出现在赋值表达式右边的表达式,他可以是不占据内存空间的临时量或字面量,可以是不具有写入权的空间实体。如
int a=3;
const int b=5;
a=b+2; //a是左值,b+2是右值
b=a+2; //错!b是只读的左值但无写入权,不能出现在赋值符号左边
(a=4)+=28; //a=4是左值表达式,28是右值,+=为赋值操作符
34=a+2; //错!34是字面量不能做左值
参考技术A 在C语言学习过程中,大家或许听到过左值和右值的概念,甚至在调试程序时编译器也会给出” left operand must be l-value ” 即左操作数必须为左值!,今天我们将为大家详细解释这两个词,以及两者的区别!

简单而言,在赋值运算符“=”左边的就是左值,在赋值运算符“=”后边的就是右值,感觉像是废话,但非常好理解。但更多时候,我们是为了学习和理解不同情况下左值和右值的区别,下面来举例依次说明,着层深入,来让大家解渴!

1.变量做左值和右值的区别:
如 x = 2;

这里x为整形变量,这里作为左值,代表的是一块内存单元,表示的是地址。

再如x = y;

现在看变量做右值情况,y做右值,这里呢就不在表示地址,而是代表该内存单元上的值!然后赋给x。

2.常量做左值和右值的区别:
继续 x = 2;

这里2做右值, 2是一个常量,没有任何疑问。

而如果 1 = 2;

这里我们看左值,是1是常量,这里就会有问题了,编译会报错!因为常量不可被修改、不可以被赋值!所以大家可能会听过或见过”可修改/不可修改的左值”。



3.数组名做左值和右值的区别:
例如有字符数组char a[100];

当a做右值时候,我们可以把它赋给char *类型的指针,用来指向这个数组,这种情况下数组名做右值代表该数组首元素的首地址,是常量,是完全可以的。

而数组名无论右值和还是左值,都代表是地址,是常量,因此它不可以做左值,因为常量不可被修改!所以不少同学试图再定义数组之后再试图对数组赋字符串都是错误的!



4.字符串常量做右值
字符串常量想必大家都很清楚,是用双引号括起来的字符串,既然也是常量,也理所当然不可以做左值,但做右值呢?

答案是,会表示该字符串在内存中存储位置的首地址。就就是char * p = “dotcpp.com”;用法的原因。

以上四种,希望对大家深入理解左值和右值有帮助!大家有任何问题,请随时留言讨论!
参考技术B 左值(lvalue)和右值(rvalue)最先来源于编译。在C语言中表示位于赋值运算符两侧的两个值,左边的就叫左值,右边的就叫右值。
定义:
左值指的是如果一个表达式可以引用到某一个对象,并且这个对象是一块内存空间且可以被检查和存储,那么这个表达式就可以作为一个左值。
右值指的是引用了一个存储在某个内存地址里的数据。
从上面的两个定义可以看出,左值其实要引用一个对象,而一个对象在我们的程序中又肯定有一个名字或者可以通过一个名字访问到,所以左值又可以归纳为:左值表示程序中必须有一个特定的名字引用到这个值。而右值引用的是地址里的内容,所以右值又可以归纳为:右值表示程序中没有一个特定的名字引用到这个值。

++a的话因为返回结果和运算之后的a一样,所以++a返回的是真实的a,可以被重新赋值,所以可以作为左值。而a++返回的是运算之前的a,而此时a已经+1了,返回的数据其实是过去的a,它是另外复制出来的,而不是真正的a,所以无法被赋值,所以它只能是右值。

所以a++;在执行当中的顺序是,先把a的值复制出来,进行整体运算,然后再a=a+1。
参考技术C C/C++语言中可以放在赋值符号左边的变量,左值表示存储在计算机内存的对象,左值相当于地址值。右值:当一个符号或者常量放在操作符右边的时候,计算机就读取他们的“右值”,也就是其代表的真实值,右值相当于数据值

C/C++语言中可以放在赋值符号左边的变量,即具有对应的可以由用户访问的存储单元,并且能够由用户去改变其值的量。左值表示存储在计算机内存的对象,而不是常量或计算的结果。或者说左值是代表一个内存地址值,并且通过这个内存地址,就可以对内存进行读并且写(主要是能写)操作;这也就是为什么左值可以被赋值的原因了。相对应的还有右值:当一个符号或者常量放在操作符右边的时候,计算机就读取他们的“右值”,也就是其代表的真实值。简单来说就是,左值相当于地址值,右值相当于数据值。右值指的是引用了一个存储在某个内存地址里的数据。

案例列举
比如: int ia,ib;

ib=0;

ia=ib;

在这里,首先定义ia,ib。然后对ib赋值,此时计算机取ib的左值,也就是这个符号代表的内存位置即内存地址值,计算机取0的右值,也就是数值0;然后给ia赋值为ib,此时取ib的右值给ia的左值;

所以说,ib的左值、右值是根据他的位置来说的;

这也算是形式语言的一个有意思之处吧。

应用注意
左值右值翻译可能有些问题。

L-value中的L指的是Location,表示可寻址。Avalue (computer science)that has an address.

R-value中的R指的是Read,表示可读。in computer science, a value that does not have an address in a computer language.

左值和右值是相对于赋值表达式而言的。左值是能出现在赋值表达式左边的表达式。左值表达式可以分为可读写的左值和只读左值。右值是可以出现在赋值表达式右边的表达式,他可以是不占据内存空间的临时量或字面量,可以使(还是《是》)不具有写入权的空间实体。如

int a=3;

const int b=5;

a=b+2; //a是左值,b+2是右值

b=a+2; //错!b是只读的左值但无写入权,不能出现在赋值符号左边

(a=4)+=28; //a=4是左值表达式,28是右值,+=为赋值操作符

34=a+2; //错!34是字面量不能做左值
参考技术D 变量做左值和右值的区别:
如 x = 2;

这里x为整形变量,这里作为左值,代表的是一块内存单元,表示的是地址。

再如x = y;

现在看变量做右值情况,y做右值,这里呢就不在表示地址,而是代表该内存单元上的值!然后赋给x。

2.常量做左值和右值的区别:
继续 x = 2;

这里2做右值, 2是一个常量,没有任何疑问。

而如果 1 = 2;

这里我们看左值,是1是常量,这里就会有问题了,编译会报错!因为常量不可被修改、不可以被赋值!所以大家可能会听过或见过”可修改/不可修改的左值”。



3.数组名做左值和右值的区别:
例如有字符数组char a[100];

当a做右值时候,我们可以把它赋给char *类型的指针,用来指向这个数组,这种情况下数组名做右值代表该数组首元素的首地址,是常量,是完全可以的。

而数组名无论右值和还是左值,都代表是地址,是常量,因此它不可以做左值,因为常量不可被修改!所以不少同学试图再定义数组之后再试图对数组赋字符串都是错误的!



4.字符串常量做右值
字符串常量想必大家都很清楚,是用双引号括起来的字符串,既然也是常量,也理所当然不可以做左值,但做右值呢?

答案是,会表示该字符串在内存中存储位置的首地址。就就是char * p = “dotcpp.com”;用法的原因。

以上四种,希望对大家深入理解左值和右值有帮助!大家有任何问题,请随时留言讨论!

什么是右值引用,跟左值又有什么区别?

目的

1、消除两个对象交互式时,不必要的拷贝,节省资源,提高效率;

2、简洁定义泛型函数;

左值和右值的概念:

左值:能取地址,或者具名对象,表达式结束后依然存在的持久对象;

右值:不能取地址,匿名对象,表达式结束后就不再存在的临时对象;

区别:

左值能寻址,右值不能;

左值能赋值,右值不能;

左值可变,右值不能(仅对基础类型适用,用户自定义类型右值引用可以通过成员函数改变);

以上是关于左值和右值的区别的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript 有左值和右值的概念吗?

具有适用于左值和右值的引用参数的 C++ 函数

左值和右值

c++中的左值和右值,右值引用到底是啥?关于引用这一节看得很迷糊。

左值引用和右值引用

什么是右值引用,跟左值又有什么区别?