为什么a[i]可以当左值或者右值,而i++一定是个右值?

gongliming7 2010-10-10 07:06:12
一直没有搞明白,如何判断一个表达式或者语句,是左值还是右值。

为什么a[i]可以是左也可以是右。

而i++为什么是右值呢?

还情大侠详细的解释一下哈!!!!!
...全文
198 11 打赏 收藏 转发到动态 举报
写回复
用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++的返回值不是的

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧