?
? ????? PHP ??? ???? ??? ?? ??
C中的每個表達(dá)式(帶有參數(shù)的運算符,函數(shù)調(diào)用,常量,變量名等)都由兩個獨立的屬性表征:一個類型和一個值類別。
每個表達(dá)式都屬于三個值類別之一:左值,非左值對象(右值)和函數(shù)指示符。
Lvalue表達(dá)式是任何具有與該類型不同的對象類型的表達(dá)式void
,它可能指定一個對象(如果左值在計算時沒有實際指定對象,那么該行為是未定義的)。換句話說,左值表達(dá)式評估為對象身份。此值類別的名稱(“左值”)具有歷史意義,反映了在CPL編程語言中使用左值表達(dá)式作為賦值運算符的左側(cè)操作數(shù)。
左值表達(dá)式可用于以下左值上下文中:
作為地址運算符的操作數(shù)(除非左值指定了一個位域或被聲明為寄存器)。
作為前/后增量和減量運算符的操作數(shù)。
作為成員訪問(點)運算符的左側(cè)操作數(shù)。
作為賦值和復(fù)合賦值操作符的左側(cè)操作數(shù)。
如果在除sizeof,_Alignof或上面列出的運算符之外的任何上下文中使用了左值表達(dá)式,則任何完整類型的非數(shù)組左值都會進(jìn)行左值轉(zhuǎn)換,該值會模擬對象值的存儲器負(fù)載。同樣地,在比其他任何上下文中使用時陣列的左值經(jīng)歷陣列到指針轉(zhuǎn)換sizeof
,_Alignof
,操作者從一個字符串?dāng)?shù)組初始化地址。
const / volatile / restrict-qualifiers和原子類型的語義只適用于左值(左值轉(zhuǎn)換去除限定符并刪除原子性)。
以下表達(dá)式是左值:
標(biāo)識符,包括函數(shù)參數(shù),只要它們被聲明為指定對象(而不是函數(shù))
字符串文字
(C99)復(fù)合文字
如果未隱含的表達(dá)式是左值,則用括號表示
如果它的左邊參數(shù)是左值,則為成員訪問(點)運算符的結(jié)果
通過指針->
操作符訪問成員的結(jié)果
將間接(一元*
)運算符的結(jié)果應(yīng)用于指向?qū)ο蟮闹羔?/p>
訂閱運算符([]
)的結(jié)果
一個可修改的左值是完整非數(shù)組類型的非常量限定的左值表達(dá)式,如果它是結(jié)構(gòu)體/聯(lián)合體,則不具有常量限定的成員,即遞歸。
只有可修改的左值表達(dá)式可以用作遞增/遞減的參數(shù),以及作為賦值和復(fù)合賦值操作符的左側(cè)參數(shù)。
通俗地稱為rvalues,非左值對象表達(dá)式是不指定對象的對象類型的表達(dá)式,而是沒有對象標(biāo)識或存儲位置的值。無法取得非左值對象表達(dá)式的地址。
以下表達(dá)式是非左值對象表達(dá)式:
整數(shù),字符和浮點常量
沒有指定返回左值的所有運算符,包括
任何函數(shù)調(diào)用表達(dá)式
任何演員表達(dá)(注意復(fù)合文字,看起來相似,是左值)
成員訪問運算符(點)施加到非左值結(jié)構(gòu)/聯(lián)合,f().x
,(x,s1).a
,s1=s2).m
所有算術(shù),關(guān)系,邏輯和位運算符
遞增和遞減運算符(注意:預(yù)格式是C ++中的左值)
賦值和復(fù)合賦值運算符(注意:它們是C ++中的左值)
條件運算符(注意:可能是C ++中的左值)
逗號運算符(注意:可能是C ++中的左值)
操作符的地址,即使它被應(yīng)用到一元運算*
符的結(jié)果中
作為一種特殊情況,類型的表達(dá)式void
被假定為非左值對象表達(dá)式,它產(chǎn)生一個沒有表示并且不需要存儲的值。
請注意,具有數(shù)組類型成員(可能嵌套)的struct / union rvalue事實上指定了具有臨時生存期的對象。該對象可以通過索引數(shù)組成員或通過數(shù)組成員的指針轉(zhuǎn)換所獲得的指針間接形成的左值表達(dá)式來訪問。
函數(shù)指示符(由函數(shù)聲明引入的標(biāo)識符)是函數(shù)類型的表達(dá)式。當(dāng)在除address-of運算符,sizeof和_Alignof之外的任何上下文中使用時(最后兩個在應(yīng)用于函數(shù)時會生成編譯錯誤),函數(shù)標(biāo)識符總是被轉(zhuǎn)換為非左值指針來運行。請注意,函數(shù)調(diào)用操作符是為指向函數(shù)的指針定義的,而不是函數(shù)指示符本身。
C11標(biāo)準(zhǔn)(ISO / IEC 9899:2011):
6.3.2.1左值,數(shù)組和函數(shù)指示符(p:54-55)
C99標(biāo)準(zhǔn)(ISO / IEC 9899:1999):
6.3.2.1左值,數(shù)組和函數(shù)指示符(p:46)
C89 / C90標(biāo)準(zhǔn)(ISO / IEC 9899:1990):
3.2.2.1左值和函數(shù)指示符