什么是左值?什么是右值?
从字面上说所谓的左值就是能在赋值符号的左边出现的数值,右值就是可以在赋值符号右边出现的数值。
其实际意义也是如此,那么哪些值可以在赋值符号左边出现,哪些可以在等号赋值符号出现的呢?
这就要从分析赋值符号左边与右边出现的值的区别着手。能被赋值的数,一定在内存里面占用有一块内存空间,并且这块空间的内容可以改变,用以存储赋予的数值。而在赋值符号右边出现的数则无此要求,因为赋值符号右边的数被赋值给赋值符号左边的数,仅仅涉及到数值,也就不涉及内存的改变。
我们来看两条语句:
k = i + 3;
i + 3 = k;
这两条语句有什么区别呢?从表面看仅仅只是顺序相反而已。我们拿到vs2015中编译一下,看看有什么结果:
可以看见,第一条语句可以通过编译,是合法的,但是第二条语句则报错说明赋值符号左边的内容不能作为左值,我们单独来看第一条语句的汇编代码:
可以看见,第一条语句底层分为三条指令:前两条语句完成赋值符号右边的加法操作,将结果存在一个临时的位置(这里是寄存器eax),最后将值赋给变量K所在的内存中。
我们再来看第二条语句,同样的执行i+3会将所得到的值先存在一个临时的内存位置,而赋值符号赋值的对象则是左边等式最终指向的地址空间,在这里,这个地址空间是不确定的,因此第二条语句是违反语法的,不能通过编译。
我们来总结一下左值与右值:
左值:在内存中有独立的内存空间,并且这块空间的内容是可变得,也就是通常所说的变量。
右值:基本所有有值的、可赋值的数都可作为右值,通常为常量(符号常量与const常量等)与变量。