C語言中文網 目錄

C語言左值與右值詳解

左值是用來指明一個對象的表達式。最簡單的左值就是變量名稱。左值(lvalue)之所以稱為“左”(以首字母為 L,代表 left),是因為一個左值表示一個對象,它可以出現在賦值運算符(assignment operator)的左邊,例如“左表達式=右表達式”。

其他表達式(那些表示一個值但不指明一個對象的),被類似地稱為右值(rvalue)。右值是可以出現在賦值運算符右邊而不是左邊的表達式。例如,常量和算術表達式。

從一個左值中必定可以解析出對應對象的地址,除非該對象是位字段(bit-field)或者被聲明為寄存器存儲類。生成左值的運算符包括下標運算符(subscript operator)[]和間接運算符(indirection operator)*,如下表所示(如果 array 已被聲明為數組,而 ptr 被聲明為指針變量)。

表1 指針和數組表達式可能是左值
表達式 是左值嗎
array[1] 是;一個數組元素是一個具有位置的對象
&array[1] 否;此對象的位置,并非一個具有位置的對象
ptr 是;此指針變量是一個具有位詈的對象
*ptr 是;指針所指的地方是一個具有位置的對象
ptr+1 否;此加法產生一個新的地址值,但不是一個對象
*ptr+l 否;此加法產生一個新的算術值,但不是一個對象

對象可以被聲明為常量。在這種情況下,該對象就不能位于賦值運算的左邊,盡管它是左值,如下面的例子所示:
int a=1;
const int b=2, *ptr=&a;
b=20;           //錯誤:b被聲明為const int
*ptr=10;        //錯誤:ptr被聲明為const int的指針
在這個例子中,表達式 a、b、ptr 和 *ptr 都是左值。但是 b 和 *ptr 是常量左值。因為 ptr 被聲明為指向 const int 的指針,不能使用它修改它所指向的對象。

賦值運算左邊的操作數,以及任何自增或自減運算符(++ 和 --)的操作數,不僅應該是左值,還應該是可修改的左值可修改的左值,其類型不可以被聲明為限定符 const,并且可修改的左值不能是數組類型。如果可修改的左值所表示的對象是結構或聯合類型,那么它的元素都不可以被聲明(不管是直接地或間接地)為具有限定符 const 的類型。

精美而實用的網站,提供C語言C++STLLinuxShellJavaGo語言等教程,以及socketGCCviSwing設計模式JSP等專題。

Copyright ?2011-2018 biancheng.net, 陜ICP備15000209號

底部Logo