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

转载 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.

左值与右值的区别

左值跟右值的区别
  • u010317005
  • u010317005
  • 2016年08月22日 00:29
  • 583

C++11左值右值、转移语义

首先看一下c++11标准新特性: 右值引用: 右值引用 (Rvalue Referene) 是 C++ 新标准 (C++11, 11 代表 2011 年 ) 中引入的新特性 , 它实现了转移语...
  • fffupeng
  • fffupeng
  • 2016年09月20日 15:17
  • 637

指针/地址 到底是左值还是右值

一下引用网友:lm_whales左值可以当作右值使用,右值不能当左值用. 左值可以出现在=的任何一方, 出现在=右方的左值,是把左值当作右值使用,这是非常正常的.右值,不能当作左值使用. 能够(...
  • qq_24964575
  • qq_24964575
  • 2016年08月14日 09:05
  • 964

a++ ++a 左值 右值

the   following   may   help   determine   wheter   an   object   is   a   lvalue   or   rvalue:   i...
  • fivedoumi
  • fivedoumi
  • 2012年10月15日 21:58
  • 989

C语言中左值与右值

声明:本文转自 http://blog.csdn.net/qikaibinglan/article/details/6203483 如果有侵犯他人版权,请通知我我会马上删除     左值就是在赋...
  • Leichelle
  • Leichelle
  • 2011年11月05日 19:44
  • 8542

C和指针(二)指针与左值、右值详解

c语言中左值、右值定义:例子:a = b + 25; 左值:能够出现在赋值符号左侧的东西。例子中a, 右值:能够出现在赋值符号右侧的东西。例子中b + 25 上面的例子可以写成这样吗? b + 25...
  • u014656992
  • u014656992
  • 2015年11月16日 11:30
  • 1961

C++11 左值、右值、右值引用详解

左值、右值在C++11中所有的值必属于左值、右值两者之一,右值又可以细分为纯右值、将亡值。在C++11中可以取地址的、有名字的就是左值,反之,不能取地址的、没有名字的就是右值(将亡值或纯右值)。...
  • u010599509
  • u010599509
  • 2016年07月27日 13:27
  • 5715

C++11之左值、纯右值和将亡值

在C++11中所有的值一定属于左值、纯右值和将亡值三种值之一,分别介绍一下这三种类型。左值与右值在C++中定义左值与右值的比较标准的方法是根据其可以取地址来判断。左值就是可以对变量进行取地址或者有名字...
  • StephenZou14
  • StephenZou14
  • 2017年09月03日 12:33
  • 288

重载中碰到的左值和右值问题

double & Student::operator[ ] (int i) {         return scores[i];  } double Student::operator[ ]...
  • mjcheng8879
  • mjcheng8879
  • 2015年10月20日 09:07
  • 335

C++ 11 左值,右值,左值引用,右值引用,std::move, std::foward

C++11, 右值引用,move, forward
  • xiaolewennofollow
  • xiaolewennofollow
  • 2016年09月16日 23:59
  • 1239
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:左值与右值(最基本的你懂吗?)
举报原因:
原因补充:

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