C/C++每日一问:左值和右值

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

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

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

表达式要么是左值要么是右值,可以出现在赋值语句左侧的称为左值,反之称为右值。

定义:

左值(lvalue, locator value)表示一个占据内存中某个可识别的位置(也就是一个地址)的对象。
右值(rvalue)则使用排除法来定义。一个表达式不是左值就是右值。
其中《C++ Primer》中是这么定义左值与右值的:
当一个对象被用作右值的时候,用的是对象的内容;当对象被用作左值的时候,用的是对象的身份(在内存中的位置)。

可修改的左值:

可修改左值是特殊的左值,不含有数组类型、不完整类型、const 修饰的类型。如果它是 struct 或 union,它的成员都(递归地)不应含有 const 修饰的类型。

左值与右值间的转换 :

1.除了数组、函数、不完整类型的所有左值都可以转换为右值。

2.右值能否转换为左值呢?当然不能!根据左值的定义,这违反了左值的本质。【注1:右值可以显式地赋值给左值。之所以没有隐式的转换,是因为右值不能使用在左值应当出现的位置。】

不过,右值可以通过一些更显式的方法产生左值。例如,一元解引用操作符'*'需要一个右值参数,但返回一个左值结果。

 CV限定的右值:

CV 限定符 这个术语指的是 const 和 volatile 两个类型限定符。C每个类型都有三个对应的 CV-限定类型版本: const 限定 、 volatile 限定 和 const-volatile 限定 版本。有或无 CV 限定的不同版本的类型是不同的类型,但写法和赋值需求都是相同的。

在 C 中,只有左值有 CV 限定的类型,而右值从来没有。而在 C++ 中,类右值可以有 CV 限定的类型,但内置类型 (如 int) 则没有。 

C++11的右值引用

左值和右值的主要区别是,左值可以被修改,而右值不能。不过,C++11 改变了这一区别。在一些特殊的情况下,我们可以使用右值的引用,并对右值进行修改。 

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

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

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

而现在多为:

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

两者有区别吗?

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

{   

    int temp = a;   

    a=a+1;   

    return temp; //返回右值   

}  

++a 则为:

{   

    a=a+1;   

    return &a; //返回左值   

}  

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

 ++x 和 x++ 的区别

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值