一般说来出现在“=”左边的是左值,出现在“=”右边的是右值,左值是可改变的值,出现在赋值号左边的符号所代表的地址上的内容一定是可以被修改的,只读变量是不能做左值的。++i
就可以作为左值,而 i++ 却不能作为左值。这也是为什么 ++++i 合法,而 i++++ 却不合法。
变量 i
i为左值时:编译器认为 i 代表的是 i 的地址,这个地址只有编译器知道,在编译时确定;
i为右值时:编译器认为 i 的含义是 i 所代表的地址里的内容,这个内容是什么,只有在运行时知道。
数组名 a
a 可以为右值。当 a 为右值时,其代表的含义是 &a[0],即数组的首元地址,而不是数组的首地址。尽管它们地址的数值是一样的,但是代表的含义不一样,比如自加的单位不同(前者与类型有关,而后者与类型和数组大小都有关)。当然 a 仅仅是代表着数组首元地址,并没有真的存储这个地址,也就是说编译器没有为数组a来分配一块内存来存储这个地址,这与指针不同。
a不可以为左值!数组分配的内存是一个整体,我们无法把数组当一个整体来访问,但是数组的元素a[i]可以作为左值。只能通过访问 a[i] 来达到访问整个数组的目的。