左值、右值、复合赋值
赋值右结合性
对于运算符的右结合性,我们从初始化与赋值开始。
代码极其简单,但有两个问题需要你回答。
定义width变量时,它的初始值是多少?
给width变量赋值后,它的值又是多少?
相信你会随口说出,width的值分别是6与5(表达式的结果),而不是2与3("="右边的第一个数值)。稍加思索,你会发现自己先计算了赋值运算符右侧的整个表达式,然后将结果赋予width变量,我们称这类运算符具有右结合性。
左值与右值
之前我们以盒子的角度讲解了变量存储数据的特性,同样,我们也可以读取变量的值。与现实不同,只要变量这个盒子存在,我们就可以无限次读取,之前的值始终存在。
可以看出,一个变量在不同的语义环境下其意义不同。
赋值时:变量取盒子的存储功能这一概念
读取时:变量取查看盒子中数据的概念
从赋值运算符的角度讲,变量在左侧时代表着写入操作,此时变量是个左值(lval),左值在程序中有一个确切的内存地址以用于写数据;在右侧时代表着读取操作,称为右值(rval)。下面的例子展示了可能的左值与右值表现方式。
显然,你不能将一个变量赋值给一个常数。但是,同一个变量却可以出现在赋值运算符的左右两侧,在左边取盒子存储的概念,在右边取读取盒中数值的概念。
复合赋值语句
虽然像 a=a; 这种语法你几乎不会用,但让a自身发变化是可行的。比如说有一个记录英雄血量的hp变量,当角色获得能量后hp值增加,我们可以这样编写:
对于这种实现,C语言也提供了一种简化的语法,称为复合赋值运算。
这里,我们使用 += 运算符完成了等同的操作,当使用这种简写形式时,不论右侧表达式多复杂,始终要将它们看作是一个整体,并与左侧变量运算求值。
除了+=,*=简写形式,C语言还提供了-=、/=、%=简写运算符,再次对于/=,%=运算进行提醒:除数不能为0。

习题
编写程序,让变量 area 存储矩形面积。
使用复合赋值运算符,让矩形面积缩小一半。
观察 Ex2 中的程序,指出变量左右值使用情况。