3-1
在C语言中,常量、变量和表达式都有左值和右值的概念。
一个量的左值是这个量的存储空间的地址,且该地址空间的内容是可以改变
的;而右值是一个量的存储空间的内容,也就是这个量的值。
所以,常量都有右值,而没有左值(虽然常量也有地址,但常量的值不能改
变);变量既有右值又有左值;每个表达式都有右值,但不一定有左值(有的表
达式有左值,有的表达式没有左值)。
如++i,因为表达式++i执行后,表达式++i的值与变量i的值相同,所以,可
认为变量i的地址就是表达式++i的地址,因此,表达式++i既有左值又有右值;
而i++,因为表达式i++执行后,表达式i++的值与变量i的值不同,所以,不
能认为变量i的地址就是表达式i++的地址,因此,表达式i++只有右值没有左值。
(1)关于赋值表达式
在介绍变量的赋值时,曾经说过“赋值号左端通常必须是变量”,这里说“通
常”就是因为有例外,准确的说应该是“赋值号左端必须是有左值的表达式”。
所以,赋值表达式的作用应该说成“把赋值号右端表达式的值写入有左值表达式
的存储空间。
【示例1】程序段是否有语法错误?如果没有,执行后a,b的值分别是多少?
int b=2, a=5;
(a*=b)+=8;
因为表达式a*=b的值与变量a的值相同,所以表达式a*=b有左值,无
语法错误。
执行时,先计算表达式(a*=b),把计算结果赋给a,再计算a+=8,所以,执
行后a,b的值分别是18和2。
(2)关于逗号表达式
对于逗号表达式“表达式1,表达式2”,如果表达式2有左值,那么,该逗号
表达式有左值,否则,该逗号表达式没有左值。
【示例2】程序段是否有语法错误?如果没有,执行后a的值是多少?
int a=2;
(a+1,a+2)=3;
(a+1,a)=3;
因为表达式a+2无左值,所以,逗号表达式a+1,a+2无左值,因此
(a+1,a+2)=3有语法错误;而因为逗号表达式a+1,a中的表达式a有左值,所 以a+1,a
有左值,因此(a+1,a)=3无语法错误。
总之,只有有左值的量才能放在赋值号的左边。