C语言 啥叫做左值?右值?

Posted

tags:

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

i和 -i 都是表达式
但一个是左值(i),一个是右值(-i)。
++,--这两种操作符要求作用于左值,所以i++合法,(-i)++不合法。

左值 ,就是指可以被取地址的表达式。简单的说,可以出现在等号左边的就是左值。比如:

另外也可以有不是变量的左值:


这里,getRef()返回的是一个全局变量的引用,它的值存在固定的位置,因此是一个左值。


右值 ,则指的是没有名字的值,它们只出现表达式的计算过程中,也就是等号的右边。例如:


getName()返回一个在函数中构造的字符串。你可以把它的值赋给一个变量,但是它是一个临时对象,我们并不知道它的值放在哪里。所以,getName()是一个右值。


说清楚了什么是左值和右值,那么什么是右值引用呢?右值引用 是C++11中新引入,是一种只绑定与右值的引用。区别与左值引用(&),它用&&来表示。与左值引用一样,它也可以是const或者是非const的,但是我们基本不会在实际应用中用到const的右值引用(这个大家可以思考一下为什么)。让我们来看一些例子:



从例子中,我们可以看到const的左值引用可以绑定到右值,非const的左值引用不能绑定到右值,右值引用可以绑定到右值。那么右值引用怎么帮助我们解决问题呢?让我们接着看右值引用在作为函数参数时的行为。假如我有下面两个函数:


第一个printReference函数是用const左值引用作为参数,从前面的例子中我们知道它既可以接受左值也可以接受右值。但是当有了第二个printReference的用右值引用的重载之后,右值将优先绑定到第二个printReference。这点我们可以通过如下代码来验证:

输出为:

参考技术A 左值就是在赋值中可以放在赋值操作符两边的值,比如:

int a = 1;
double b = 2.0

a = b;
b = a;

这里a和b都是左值,一切变量都是左值,但const量是例外。

而右值则是只可以放在赋值操作符右边的值,比如:

int a = 0;
char *b = "hello";

3 = a; // ERROR
"howdy" = b // ERROR

这里3和"howdy"都是右值,所以不能放在赋值操作符左边,一切常数、字符和字符串都是右值。

参考资料:http://zhidao.baidu.com/question/20860710.html?si=1

本回答被提问者采纳
参考技术B 感觉一楼没有回答楼主的问题,不严谨的讲,左值右值的区分在于位于等号的那一侧,左侧的是左值,通常是一个变量,右侧的是右值,可以是一个变量,或者是一个表达式。

另外说明一下,i不仅是一个表达式,它还是一个变量,但是-i却不是一个变量,这是他们一个可以自增一个不能自增的根本原因

对于i++来说,i是一个变量,所以是一个左值,执行i=i+1
但是对于(-i)++来说,-i是一个表达式,而不是一个变量,一个表达式是不可以作为左值的,因为没有办法执行这条语句:-i=-i+1(-i+1的值不能附给-i,因为没有-i这个变量存储空间)
参考技术C 左值是存储单元(地址,容器),右值是值(内容)。只是从不同的角度来描述“值”,至于什么时候是右值什么时候是左值,有结合当前的上下文来看,表示存储单元的时候就是左值,表示内容的时候就是右值。
就好比电场强度和电势差,电场强度是从力的角度来描述电场,电势差是从能量的角度来描述电场。

左值的定义:代表变量的表达式。 理解成左值是存储单元(地址,容器),右值是值(内容)很合适。还有一个概念就是左值转换。
int a ,b;
a=1;//a左值,1右值。
b=2;//b左值,2右值。
a=b;//a左值,b左值。这个过程有一个左值转换的过程,b进行了左值转化了
参考技术D 一个赋值表达式:
X = Y;
在这个表达式里,符号X的含义是X所代表的地址,这被称为左值,左值在编译时可知,左值表示存储结果的地方;
在这个表达式里,符号Y的含义是Y所代表的地址的内容,这被称为右值,右值在运行时才可知,如无特别说明,右值表示“Y的内容”。

在《C专家编程(中文版)》中第4章,对左值和右值的基本描述,其余的拓展描述你可以自己看。

参考资料:C专家编程(Expert C Programming) Peter Van Der LinDen(美)

c语言lvalue expected啥含义

lvalue 就是left value 就是左值的意思。
根据等号划分,把等号左边的部分叫做左值,把等号右边的叫做右值,例如a=n;那么a是左值,n是右值。不是所有东西都可以放在等号左边。等号左边的一定是一个变量或一个存储空间,出现你的这种问题,多数是这样的情况3=5;或者是6=b 也就是: 一个常量 = 数值。
有不懂得,欢迎继续提问。
参考技术A

1、这是在C语言编程时出现的错误提示 non-lvalueinassignment 译文:赋值中无左值 。

2、在该程序指令中没有左值,因为左值是对象的地址。类型的引用参数 只能接受本类型对象的左值。

以上是关于C语言 啥叫做左值?右值?的主要内容,如果未能解决你的问题,请参考以下文章

在C语言中赋值语句有啥作用?

左值的详解

对左值与右值的一些个人思考

C++11新概念:右值引用

c++c++面试知识6——第六章 语言特性相关

C++:神一样的左值