簡單而言,出現在賦值符「=」右邊的就是右值,出現在賦值符「=」左邊的就是左值。
比如,x=y。
左值:在這個上下文環境中,編譯器認為x的含義是x所代表的位址。這個位址只有編譯器知道,在編譯的時候確定,編譯器在乙個特定的區域儲存這個位址,我們完全不必考慮這個位址儲存在**。
c語言引入乙個術語——「可修改的左值」。意思就是,出現在賦值符左邊的符號所代表的位址上的內容一定是可以被修改的。換句話說,就是我們只能給非唯讀變數賦值。
既然已經明白左值和右值的區別,那麼下面就討論一下陣列作為左值和右值的情況。
當a作為右值的時候代表什麼意思呢?很多書認為是陣列的首位址,其實這是非常錯誤的。a作為右值時其意義與&a[0]是一樣的,代表的是陣列首元素的首位址,而不是陣列的首位址(用在表示式sizof(a)中時,a表示的是陣列名,此時a並沒有被用作右值),這是兩碼事。但是注意,這僅僅是代表,並沒有乙個地方(這只是簡單地這麼認為,其具體實現細節不做過多討論)來儲存這個位址,也就是說,編譯器並沒有為陣列a分配一塊記憶體來儲存其位址,這一點就與指標有很大的差別。
a不能作為左值!這個錯誤幾乎每乙個學生都犯過。編譯器會認為陣列名作為左值代表的意思是a的首元素的首位址,但是這個位址開始的一塊記憶體是乙個總體,我們只能訪問陣列的某個元素,而無法把陣列當做乙個總體進行訪問。所以我們可以把a[i]當左值,而無法把a當左值。其實我們完全可以把a當做乙個普通的變數來看,只不過這個變數內部分為很多小塊,只能通過分別訪問這些小塊來達到訪問整個變數a的目的。
指標和陣列(陣列名a作為左值和右值的區別)
簡單而言,出現在賦值符 右邊的就是右值,出現在賦值符 左邊的就是左值。比如,x y。c語言引入乙個術語 可修改的左值 意思就是,出現在賦值符左邊的符號所代表的位址上的內容一定是可以被修改的。換句話說,就是我們只能給非唯讀變數賦值。既然已經明白左值和右值的區別,下面就討論一下陣列作為左值和右值的情況 ...
陣列名作為左值和右值的區別
簡單的說,就是陣列名出現在賦值符號 左邊的就是左值,出現的右邊的就是右值。舉例 x y 左值 在這個上下文環境中,編譯器認為x的含義是x所代表的位址。當然,這個位址只有編譯器知道咯。右值 在這個上下文環境中,編譯器認為y是y所代表的位址裡面的內容。至於內容是什麼,只有執行的時候,編譯器才知道。進入正...
左值和右值,左值引用和右值引用
左值 lvalue 這一術語 於c語言,用來指代那些可以用在賦值表示式左側的東西,具名物件 在棧和堆上分配的物件,或者其他物件的成員,總之就是又確定儲存空間的東西。而術語右值 rvalue 也是源自c語言,指的是只能在賦值表示式右側出現的東西,如字面值和臨時物件。只能繫結到左值,不能繫結到右值的引用...