左值、右值、復(fù)合賦值
賦值右結(jié)合性
對(duì)于運(yùn)算符的右結(jié)合性,我們從初始化與賦值開(kāi)始。
代碼極其簡(jiǎn)單,但有兩個(gè)問(wèn)題需要你回答。
定義width變量時(shí),它的初始值是多少?
給width變量賦值后,它的值又是多少?
相信你會(huì)隨口說(shuō)出,width的值分別是6與5(表達(dá)式的結(jié)果),而不是2與3("="右邊的第一個(gè)數(shù)值)。稍加思索,你會(huì)發(fā)現(xiàn)自己先計(jì)算了賦值運(yùn)算符右側(cè)的整個(gè)表達(dá)式,然后將結(jié)果賦予width變量,我們稱這類運(yùn)算符具有右結(jié)合性。
左值與右值
之前我們以盒子的角度講解了變量存儲(chǔ)數(shù)據(jù)的特性,同樣,我們也可以讀取變量的值。與現(xiàn)實(shí)不同,只要變量這個(gè)盒子存在,我們就可以無(wú)限次讀取,之前的值始終存在。
可以看出,一個(gè)變量在不同的語(yǔ)義環(huán)境下其意義不同。
賦值時(shí):變量取盒子的存儲(chǔ)功能這一概念
讀取時(shí):變量取查看盒子中數(shù)據(jù)的概念
從賦值運(yùn)算符的角度講,變量在左側(cè)時(shí)代表著寫入操作,此時(shí)變量是個(gè)左值(lval),左值在程序中有一個(gè)確切的內(nèi)存地址以用于寫數(shù)據(jù);在右側(cè)時(shí)代表著讀取操作,稱為右值(rval)。下面的例子展示了可能的左值與右值表現(xiàn)方式。
顯然,你不能將一個(gè)變量賦值給一個(gè)常數(shù)。但是,同一個(gè)變量卻可以出現(xiàn)在賦值運(yùn)算符的左右兩側(cè),在左邊取盒子存儲(chǔ)的概念,在右邊取讀取盒中數(shù)值的概念。
復(fù)合賦值語(yǔ)句
雖然像 a=a; 這種語(yǔ)法你幾乎不會(huì)用,但讓a自身發(fā)變化是可行的。比如說(shuō)有一個(gè)記錄英雄血量的hp變量,當(dāng)角色獲得能量后hp值增加,我們可以這樣編寫:
對(duì)于這種實(shí)現(xiàn),C語(yǔ)言也提供了一種簡(jiǎn)化的語(yǔ)法,稱為復(fù)合賦值運(yùn)算。
這里,我們使用 += 運(yùn)算符完成了等同的操作,當(dāng)使用這種簡(jiǎn)寫形式時(shí),不論右側(cè)表達(dá)式多復(fù)雜,始終要將它們看作是一個(gè)整體,并與左側(cè)變量運(yùn)算求值。
除了+=,*=簡(jiǎn)寫形式,C語(yǔ)言還提供了-=、/=、%=簡(jiǎn)寫運(yùn)算符,再次對(duì)于/=,%=運(yùn)算進(jìn)行提醒:除數(shù)不能為0。

習(xí)題
編寫程序,讓變量 area 存儲(chǔ)矩形面積。
使用復(fù)合賦值運(yùn)算符,讓矩形面積縮小一半。
觀察 Ex2 中的程序,指出變量左右值使用情況。