左值与右值(最基本的你懂吗?)

转载 2012年03月30日 13:57:57

左值和右值每个程序员都会碰到,但它们究竟是什么以及如何理解它运用它,一开始大家都会感觉比较困难。也许你根本没有想过常见的左值与右值到底有什么本质的区别,拿过来用就是了。还也许会认为等号就是判断左右值的杠杆,中间插个笑话,有师弟说电脑主板上面的南桥北桥与放置的位置相关!大笑

所以我想写这篇总结性的文章(整理性质的)来帮助大家理解它们。希望对大家有帮助。

首先我们需要理解左值和右值的定义:

左值指的是如果一个表达式可以引用到某一个对象,并且这个对象是一块内存空间且可以被检查和存储,那么这个表达式就可以做为一个左值。

右值指的是引用了一个存储在某个内存地址里的数据。

从上面的两个定义可以看出,左值其实要引用一个对象,而一个对象在我们的程序中又肯定有一个名字或者可以通过一个名字访问到,所以左值又可以归纳为:左值表示程序中必须有一个特定的名字引用到这个值。而右值引用的是地址里的内容,所以相反右值又可以归纳为:右值表示程序中没有一个特定的名字引用到这个值除了用地址。

    好这些都是从定义上理解左值右值,那么我们再用这些定义作为我们的理论基础来总结一下哪些是左值,哪些是右值:

左值:

Expression

Lvalue

x = 42

x

*ptr = newvalue

*ptr

a++

a++

b[0] = 100

b[0]

const int m = 10

m

int& f()

The function call to f()

右值:

Expression

Rvalue

100

100

a * b

The expression of a * b

int f()

The function call to f() that does not return reference

以上这些内容都可以用定义来解释为什么这些为左值,而那些为右值。但我要特殊解释一下为什么函数的调用只能作为右值除了这个函数返回的是引用。其实这个也非常好解释,因为如果一个函数返回的值是 内建类型,那么这个返回值是没有办法通过一个名字或者表达式引用到的,同理如果一个函数返回的是一个对象,那么这个对象是一个临时的,也不可能用一个名字访问到。所以函数的调用通常只能作为右值,但如果一个函数返回引用,那么它的返回值就有意义了,因为它是另一个名字的别名,有名字了,所以它就变成了左值。

注意:左值能转化为右值,但反之不行。

好了,讲了这么多我觉得已经足够,但还要多讲一点,这点就是哪些操作符必需左值.

Operator

Requirement

& (unary)

Operand must be an lvalue.

++ --

Operand must be an lvalue. This applies to both prefix and postfix forms.

= += -= *= %= <<= >>= &= ^= |=

Left operand must be an lvalue.

相关文章推荐

左值和右值

  • 2013年07月15日 15:16
  • 1KB
  • 下载

基本语言细节--C++11标准之右值引用(ravalue reference)

基本语言细节--C++11标准之右值引用(ravalue reference) 简介:Move the contents of an existing element to a new eleme...

数组名a 作为 左值和 右值的区别

比如:x=y 左值:在这个上下文环境中,编译器认为x的含义是x所代表的地址。这个地址只有编译器知道,在编译的时候确定,编译器在一个特定的区域保存这个地址,我们完全不必考虑这个地址保存在哪里。 ...
  • kangear
  • kangear
  • 2013年05月25日 09:41
  • 3159

右值与左值解析

C++ 11中引入的一个非常重要的概念就是右值引用。理解右值引用是学习“移动语义”(move semantics)的基础。而要理解右值引用,就必须先区分左值与右值。        对左值和右值的一个...
  • LaoJiu_
  • LaoJiu_
  • 2015年12月31日 08:42
  • 12726

C++拾遗--引用(左值引用、右值引用)

前言引用就是别名(alias)。所谓别名,就是对已存在的对象另起一个名字。本身含义并不难理解,但与其它概念一组合,就成了使用难点。再加上新标准提出了新的一种引用-右值引用,引用这一概念就变得更加难以理...

The New C++ -- 变量 (7. 左值,右值)

左值右值也是C++中的一个很常见也很重要的概念,但奇怪的是大部分教科书并不会详细提及。本系列文章中的很多地方都会提到左值右值,请务必仔细理解。 左值(lvalue),源自于left-value,...

4.1 左值到右值的转换 中英文对照(C++标准中文版 ISO/IEC 14882:2014)

4.1 左值到右值的转换 中英文对照(C++标准中文版 ISO/IEC 14882:2014)
  • allwiki
  • allwiki
  • 2016年04月09日 22:38
  • 477

关于const violate 左值右值的部分整理

首先要搞清楚的是,什么是左值,什么是右值。这里给出左值右值的定义: 1、左值是可以出现在等号(=)左边的值,右值是只能出现在等号右边的值。 2、左值是可读可写的值,右值是只读的值。 ...
  • zzhays
  • zzhays
  • 2012年07月30日 22:22
  • 1983

关于左值和右值的Q & A

关于左值和右值的Q & A 版权声明:可以任意转载,转载时请务必以超链接形式标明如下文章原始出处和作者信息及本声明  作者:xixi  出处:http://blog.csdn.n...

左值引用与右值引用

左值引用 我们平时常见的引用,即左值引用,本质上是一个隐式指针,为对象的一个别名,通过操作符&来实现。引用中的&和取值操作中的&区别很简单,我们可以用一句话来概括,和类型在一起的是引用,和变量在一起的...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:左值与右值(最基本的你懂吗?)
举报原因:
原因补充:

(最多只允许输入30个字)