| |||
| 我来给出一些相关的细节吧,虽然我不能把这一切组成一个可以自圆其说的简单规则。 表达式分很多种啊 1。 "abc", 1.1之类的literal是右值。 2。所有命名变量,不管是const还是非const,都是左值。这条有点别扭的地方是对于常量定义:const int i = 5; 这个i也成了左值,而#define i 1里面的i却是右值。 3。函数返回引用的,对函数的调用结果为左值。否则为右值。从这条来说,*p可以写成p.operator*(), 返回引用,所以是左值。同理a[i]也是左值啦。 左值和右值的区别: 因为左值也可能为const,右值也可能不是const,所以C里面的等号左边的区分好像不大好用。 可能可以如此区分:左值可以用内建的&符号取地址(虽然对常量定义取地址可能结果不定);右值不能用&取地址(虽然任何一个成员函数内部都可以得到this指针也可以返回它) 就这些支离破碎,到处充满了例外的条条,就是我的左值/右值的理解了。 ![]() |
| |||
| 我来说一下我自己的理解: 左值其实表示的是地址,右值表示的是地址中的内容。 而左值呢,有分为可修改左值和不可修改左值;对于赋值符必须要求可修改的左值作为其左侧操作数。所以有: 数组名虽然是左值,但是是不可修改的左值,不能对它进行赋值。 对于一个表达式来说,一定是左值或右值,或者既可以为左值也可以为右值。看它到底是左值还是右值,就要看它所在的上下文了。如: int x = 0, y = 7, z = 3; x = y;//这里x作为左值出现 z = x;//这里x作为右值出现 不过在c++中左值右值的概念好像复杂的多呢 |