社区
C++ 语言
帖子详情
为什么a[i]可以当左值或者右值,而i++一定是个右值?
gongliming7
2010-10-10 07:06:12
一直没有搞明白,如何判断一个表达式或者语句,是左值还是右值。
为什么a[i]可以是左也可以是右。
而i++为什么是右值呢?
还情大侠详细的解释一下哈!!!!!
...全文
198
11
打赏
收藏
为什么a[i]可以当左值或者右值,而i++一定是个右值?
一直没有搞明白,如何判断一个表达式或者语句,是左值还是右值。 为什么a[i]可以是左也可以是右。 而i++为什么是右值呢? 还情大侠详细的解释一下哈!!!!!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
11 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
fibbery
2010-10-10
打赏
举报
回复
[Quote=引用 5 楼 gules 的回复:]
我们一般判别左值还是右值是看其“根据语义”可否在 = 操作符的左边或右边出现。
根据语义,[]操作符依据指定下标值来“存取”一维数据结构的元素,因而a[i]可在出现在=左边(用于“写”),也可以出现在=右边(用于“读”),故[]可以是左值(当然也是右值,左值可转化为右值);
同样根据语义,后置++操作符“先取操作数的原值,再对操作数+1(待其所在整个表达式结束后)”,那么这当中就有两个“值对象……
[/Quote]
支持5楼
taodm
2010-10-10
打赏
举报
回复
没啥可解释的,因为“规定”
Jesusgospelnj
2010-10-10
打赏
举报
回复
简单的理解:
左值:能够存储值,有实际内存空间的对象
右值:就是一个常量值。
右值可以是常量或者是左值。
左值必须具有左值特性的值。
形象点表示:
变量或常量 可以放在 = 的右边
变量 可以放在 = 的 左边。但是常量不能放在 = 的左边。
harderman
2010-10-10
打赏
举报
回复
左值必须是在内存中有自己的地址.
还有不要对左值和右值研究太深,否则会走火入魔
lovestefanie
2010-10-10
打赏
举报
回复
学习了
ccyiming
2010-10-10
打赏
举报
回复
学习了
gules
2010-10-10
打赏
举报
回复
我们一般判别左值还是右值是看其“根据语义”可否在 = 操作符的左边或右边出现。
根据语义,[]操作符依据指定下标值来“存取”一维数据结构的元素,因而a[i]可在出现在=左边(用于“写”),也可以出现在=右边(用于“读”),故[]可以是左值(当然也是右值,左值可转化为右值);
同样根据语义,后置++操作符“先取操作数的原值,再对操作数+1(待其所在整个表达式结束后)”,那么这当中就有两个“值对象”——原值对象与+1后的操作数本身对象,因此在整个表达式结束后实际上只有一个对象(就是++符的操作数对象,原值对象是个临时对象被销毁),故在表达式“=”中,原值对象不能出现在左边而只能在右边,所以为右值。
laibin4922565557
2010-10-10
打赏
举报
回复
楼上回答很清楚!!基础很重要呀
arong1234
2010-10-10
打赏
举报
回复
要当左值,表达式的结果必须存在一个可寻址的内存中(地址不可知的临时内存不算)。从a++表达式来看,唯一可能分配给这个表达式的内存是变量a所在的内存,但是由于a++表达式的值和a变量不等,因此a++不可能存在a所在的内存中。因此,你不可能找到一个可寻址的内存给a++放,所以a++不可能是左值[Quote=引用楼主 jeanlove 的回复:]
一直没有搞明白,如何判断一个表达式或者语句,是左值还是右值。
为什么a[i]可以是左也可以是右。
而i++为什么是右值呢?
还情大侠详细的解释一下哈!!!!!
[/Quote]
鼠
2010-10-10
打赏
举报
回复
因为左值表达式可以转变为右值,但是右值不能随便转成左值。
ww884203
2010-10-10
打赏
举报
回复
a[i]有固定的地址,i++的返回值不是的
又学懂辣 !五分钟带你掌握C
++
中的
左值
,
右值
,
左值
引用,
右值
引用 以及
++
i和i
++
的深度刨析 史上最详细!
1.
左值
是具有持久性且可以获取地址的对象或表达式,通常出现在赋值操作符的左边,例如变量或具名对象。 2
右值
是临时性的、无法获取地址的对象或表达式,通常出现在赋值操作符的右边,例如临时计算的结果或字面量。 3.
左值
引用使用 & 声明,用于操作现有对象而避免复制,如传递参数和返回内部对象引用。 4.
右值
引用使用 && 声明,用于实现移动语义和优化临时对象的资源管理。
26.C
++
中的
左值
和
右值
是什么?
++
i是
左值
还是
右值
,
++
i和i
++
那个效率更高?
但对于自定义类型(如迭代器),),现代编译器可能优化掉。: 对于基本类型(如。
C语言编程 ——
左值
与
右值
、i
++
与
++
i
左值
和
右值
i
++
与
++
i
java
左值
与
右值
问题_i
++
和
++
i以及
左值
,
右值
左值
(LValue)和
右值
(RValue)的一个快捷记法是赋值运算,
左值
是赋值运算左边的值,
右值
就是右边(=,=废话)。例如:int a = 5;a就是
左值
,5就是
右值
。当然,如果真是这么个含义,那么这概念就相当蛋疼了。其实不是这样的~~
左值
其实是对一块内存区域的引用(这个还不是C
++
中的int &a之类的引用),比如上边的a,就对应了一块内存区域(起始地址为&a,大小为sizeo...
[c
++
]i
++
和
++
i的
左值
右值
问题
由于前置
++
返回的是本身的引用,而后置
++
返回的是一个临时的拷贝。所以表达式 x
++
返回的是一个将亡值,我们无法对其取地址,所以是一个
右值
,而
++
x 返回的是 x 本身,所以是一个
左值
。我们采用代码来验证一下,使用一个万能引用来传入表达式的返回值,然后使用 decltype 对参数的类型进行推导,最后使用 type_traits 进行左
右值
的判断。可以看到结论:表达式 i
++
是一个
右值
,
++
i 是一个
左值
。其原理也很基础,我们仿写一下 int 的前置
++
和后置
++
。
C++ 语言
65,210
社区成员
250,518
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章