@raof01
本来我以为我们的观点接近了,但是看到你说 x + 1 的 x 是左值, 我就知道我们根本没有持相同观点.
现在,我解释一下为什么 x + 1 中的 x 是右值, 首先要明确对于一个表达式,究竟是左值还是右值, 取决于它在表达式中的位置, 它并不是一定为左值或者右值,这一点你可以去看c++标准,如果你对这点都不认同,我们其实已经无法再继续讨论了。
其次,对于一个表达式,它都会有一个对象和它对应,无论它是一个变量,还是能产生一个临时对象,或者是一个字面常量(自演算表达式). 这一点你应该是同意的. 那么一个对象, 其实是一个映射关系, 它实际存在在内存中(或者寄存器中), 它一定有位置信息和值信息(当然得到值还需要类型信息), 符号表是在编译时转换用的,运行时虽然没有这个表存在,但这个映射关系是存在的. 变量就表示了这层关系.
表达式 x 的运算结果就是 x , 但是这个运算结果是 x 本身吗? 答案是否定的, 众所周知, 内存单元是无法做算术运算的, x 的值 需要被取到 寄存器中, 然后才能加 1 . 如果你看汇编, 你会看到 一个 类似 lea 的指令, 所以 x 代表了它的值(先不管是左值还是右值).
对于一个非引用类型的a, a=b , 是会让 a 和 b 变成同一个对象吗? 不是, 只是让 a 和 b 的值相等.
象basic那样,给赋值加上一个let, let a = b, 这个a 是符号表中的那个a吗? 一定. b是符号表中那个b吗? 不必. 其实编译器也是这么认为的, 如果 b 的值 已经被取到寄存器,它不会再取一次. 就象读起来那样, 让a等于b, 只要跟b相等就好, b的位置在哪里无所谓, 但a在哪里就很重要了,否则就会给错人.
说的很乱,可能看不懂,其实回到本来的字面,左值就是放到等号左边的值,右值就是放到右边的值. 从 a = b 可以看出, 左值表示位置, 右值表示内容(也就是值).
再回到 x + 1, x + 1 会改变 x 吗? 不会, 那么不一定需要x ,更不需要 x 的位置, 一个和 x 相等的对象也行, 所以, 这里的x 是右值.
对于非命令式语言, 就没有左右值的烦恼, 命令式语言着实的麻烦. 怎么做的,解释起来都费劲.
呵呵.
回复 更多评论