C语言 什么叫做左值?右值?
但一个是左值(i),一个是右值(-i)。
++,--这两种操作符要求作用于左值,所以i++合法,(-i)++不合法。 展开
2019-11-25 · 微策略专注于企业级分析和移动应用软件开发
左值 ,就是指可以被取地址的表达式。简单的说,可以出现在等号左边的就是左值。比如:
另外也可以有不是变量的左值:
这里,getRef()返回的是一个全局变量的引用,它的值存在固定的位置,因此是一个左值。
右值 ,则指的是没有名字的值,它们只出现表达式的计算过程中,也就是等号的右边。例如:
getName()返回一个在函数中构造的字符串。你可以把它的值赋给一个变量,但是它是一个临时对象,我们并不知道它的值放在哪里。所以,getName()是一个右值。
说清楚了什么是左值和右值,那么什么是右值引用呢?右值引用 是C++11中新引入,是一种只绑定与右值的引用。区别与左值引用(&),它用&&来表示。与左值引用一样,它也可以是const或者是非const的,但是我们基本不会在实际应用中用到const的右值引用(这个大家可以思考一下为什么)。让我们来看一些例子:
从例子中,我们可以看到const的左值引用可以绑定到右值,非const的左值引用不能绑定到右值,右值引用可以绑定到右值。那么右值引用怎么帮助我们解决问题呢?让我们接着看右值引用在作为函数参数时的行为。假如我有下面两个函数:
第一个printReference函数是用const左值引用作为参数,从前面的例子中我们知道它既可以接受左值也可以接受右值。但是当有了第二个printReference的用右值引用的重载之后,右值将优先绑定到第二个printReference。这点我们可以通过如下代码来验证:
输出为:
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
另外说明一下,i不仅是一个表达式,它还是一个变量,但是-i却不是一个变量,这是他们一个可以自增一个不能自增的根本原因
对于i++来说,i是一个变量,所以是一个左值,执行i=i+1
但是对于(-i)++来说,-i是一个表达式,而不是一个变量,一个表达式是不可以作为左值的,因为没有办法执行这条语句:-i=-i+1(-i+1的值不能附给-i,因为没有-i这个变量存储空间)
就好比电场强度和电势差,电场强度是从力的角度来描述电场,电势差是从能量的角度来描述电场。
左值的定义:代表变量的表达式。 理解成左值是存储单元(地址,容器),右值是值(内容)很合适。还有一个概念就是左值转换。
int a ,b;
a=1;//a左值,1右值。
b=2;//b左值,2右值。
a=b;//a左值,b左值。这个过程有一个左值转换的过程,b进行了左值转化了
X = Y;
在这个表达式里,符号X的含义是X所代表的地址,这被称为左值,左值在编译时可知,左值表示存储结果的地方;
在这个表达式里,符号Y的含义是Y所代表的地址的内容,这被称为右值,右值在运行时才可知,如无特别说明,右值表示“Y的内容”。
在《C专家编程(中文版)》中第4章,对左值和右值的基本描述,其余的拓展描述你可以自己看。
参考资料: C专家编程(Expert C Programming) Peter Van Der LinDen(美)