C++左值与右值之间共同与不同点解析

开发 后端
C++左值与右值都有哪些不同之处,又有哪些联系呢?我们将会通过对这篇文章的介绍,为大家详细讲解有关内容,帮助大家理解。

C++编程语言与C语言相比有很多不同之处,而且这些不同的地方有都体现着非常重要的作用。现在我们将会为大家详细介绍一下有关C++左值与右值之间的一些联系,希望能帮助大家对这一语言有一个深刻的认识。#t#

1. C++左值与右值概念

变量和文字常量都有存储区,并且有相关的类型,区别在于变量是可寻址的;

对于每个变量,都有2个值与其相关联:

1>数据值,存储在某个内存地址中,也称右值(rvalue),右值是被读取的值(read value),文字常量和变量都可被用于右值。

2>地址值,即存储数据值的那块内存地址,也称左值(lvalue),文字常量不能被用作左值。

2 . C++左值与右值的相关问题

给表达式加上括号: ++a--

结果 ++(a--)

这个表达式是非法的,因为前增量操作要求一个可修改的左值,而 "a--" 不是左值(即右值)

3 . C++左值与右值中前增量和后增量的区别

早期的c语言教材,for循环语句通常写成:

for(int i=0;i<10;i++)

而现在多为:

for(int i=0;i<10;++i)

两者有区别吗?

a++ 即是返回 a的值,然后变量 a 加 1,返回需要产生一个临时变量类似于

  1. {   
  2. int temp = a;   
  3. aa=a+1;   
  4. return temp; //返回右值   
  5. }  

 

++a 则为:

  1. {   
  2. aa=a+1;   
  3. return &a; //返回左值   
  4. }  

 

显然,前增量不需要中间变量,效率更高。

C++左值与右值的含义与误区

术语 “L-Values” 和 “R-Values” 是很容易被搞混的,因为它们的历史渊源也是混淆。他们最初起源是编译器的设计者,从字面上来理解就是表达式左边的值和表达式右边的值。它们的含义一直在演化而名字却没变,现在已经“名”不副“实”了。虽然还是称为left-value 和right-value,但是他们的含义已经大大不同了。

C++ 03 标准上是这样写的: “每一个表达式要么是一个 lvalue,要么就是一个 rvalue。”

记住,lvalue和rvalue是针对表达式而言的。

lvalue 是指那些单一表达式结束之后依然存在的持久对象。例如: obj,*ptr, prt[index], ++x 都是 lvalue。

rvalue 是指那些表达式结束时(在分号处)就不复存在了的临时对象。例如:1729 , x + y , std::string("meow") , 和 x++ 都是 rvalue。

++x 和 x++ 的区别的语义上的区别: 当写 int i = 10 ; 时, i 是一个 lvalue,它实际代表一个内存里的地址,是持久的。 表达式 ++x 也是一个 lvalue,它修改了 x 的值,但还是代表原来那个持久对象。但是,表达式 i++ 却是一个 rvalue,它只是拷贝一份i的初值,再修改i的值,***返回那份临时的拷贝,那份拷贝是临时对象。 ++i 和 i++ 都递增i,但 ++i 返回i本身,而 i++ 返回临时拷贝。这就是为什么 ++i 之所以是一个 lvalue,而 i++ 是一个 rvalue。

lvalue 与 rvalue 之分不在于表达式做了什么,而在于表达式代表了什么(持久对象或临时产物)。 判断一个表达式是不是 lvalue 的直接方法就是“能不能对表达式取址?”,如果能够,那就是一个 lvalue;如果不能,那就是一个 rvalue。

以上就是我们为大家介绍的有关C++左值与右值的相关介绍。

责任编辑:曹凯 来源: 博客园
相关推荐

2022-02-16 12:52:22

C++项目编译器

2009-08-25 09:58:56

C#参数不同点

2009-09-22 13:14:29

Hibernate gHibernate l

2009-08-12 14:59:09

C#和Java不同点

2010-08-12 08:57:25

2012-02-13 10:18:42

C++ 11

2024-03-05 09:55:00

C++右值引用开发

2022-07-26 00:36:06

C#C++函数

2010-08-24 09:29:37

内连接全连接

2010-02-03 09:52:52

C++指针与引用

2010-01-25 15:55:50

托管C++

2009-11-17 09:07:55

静态构造函数

2024-10-12 14:18:21

C++OOP函数重载

2011-09-02 14:45:43

Oracle临时表SQL Server临

2010-01-11 11:09:10

C++语法

2023-09-12 10:20:40

C++函数

2011-06-13 14:54:35

PageRank算法

2010-06-13 09:18:28

UML依赖

2024-03-11 15:32:50

C++开发

2023-12-22 13:58:00

C++链表开发
点赞
收藏

51CTO技术栈公众号