C語言中左值物件有哪些 哪些資料型別或是表示式可以算作是左值

2022-04-10 02:39:48 字數 3868 閱讀 6121

1樓:仉丹雍詩

左值,算是可訪問儲存的區域,要求「可訪問儲存」,那就可改變,變數(很多態別)就是,常數不是,你可以根據這個判斷下左值。

理解下左值物件吧,一般來說是計算機裡一塊可訪問可儲存的區域,物件只是這塊區域的抽象標識,變數a,b,*p等都算,只不過按不同的型別分出不同大小的區域。標識可以任意給,所以物件有哪些,舉不完,而物件型別倒是有,什麼int物件,char物件,指標物件等等吧。

既然左值要求的是「可訪問可儲存」,即可找到它改變它,這個則不會關係到區域大小。而儲存區域大小是靠型別來確定(比如int我分多大記憶體啊),既然不關係到大小,與資料型別何干!

有幾個運算子構成的表示式,可以算是左值,不過很少(比如a++;a--;*p等他們可單獨成立,這個我也知道不多,還有sizeof(?)挖一塊?大小的區域),其他的一般都算右值的,因為表示式最後一般都會產生乙個不可變的值(比如a+b,最終整個表示式代表乙個結果值,不可變,它要賦給乙個儲存物件也就是左值),當然左值表示式可以做右值,它本來就存有乙個值,可以傳給他人嘛。。。

以前研究過左值,可以一起討論下。。。。。

2樓:符玉蓉亥月

如果ij同時被

2整除,那麼

i%2和

j%2的值都是

0,也就是說

!(i%2)

和!(j%2)

的值都是

1,必須要它們同時為

1才能斷定ij

同時被2

整除,所以要用

&&,即

!(i%2)

&&!(j%2)

最好是寫成這樣,更清晰明了:

(!(i%2))

&&(!(j%2))

c語言 什麼叫做左值?右值?

3樓:微策略中國

另外也可以有不是變數的左值:

這裡,getref()返回的是乙個全域性變數的引用,它的值存在固定的位置,因此是乙個左值。

getname()返回乙個在函式中構造的字串。你可以把它的值賦給乙個變數,但是它是乙個臨時物件,我們並不知道它的值放在**。所以,getname()是乙個右值。

說清楚了什麼是左值和右值,那麼什麼是右值引用呢?右值引用 是c++11中新引入,是一種只繫結與右值的引用。區別與左值引用(&),它用&&來表示。

與左值引用一樣,它也可以是const或者是非const的,但是我們基本不會在實際應用中用到const的右值引用(這個大家可以思考一下為什麼)。讓我們來看一些例子:

從例子中,我們可以看到const的左值引用可以繫結到右值,非const的左值引用不能繫結到右值,右值引用可以繫結到右值。那麼右值引用怎麼幫助我們解決問題呢?讓我們接著看右值引用在作為函式引數時的行為。

假如我有下面兩個函式:

第乙個printreference函式是用const左值引用作為引數,從前面的例子中我們知道它既可以接受左值也可以接受右值。但是當有了第二個printreference的用右值引用的過載之後,右值將優先繫結到第二個printreference。這點我們可以通過如下**來驗證:

輸出為:

4樓:叫我俠哥哥

左值是儲存單元(位址,容器),右值是值(內容)。只是從不同的角度來描述「值」,至於什麼時候是右值什麼時候是左值,有結合當前的上下文來看,表示儲存單元的時候就是左值,表示內容的時候就是右值。

就好比電場強度和電勢差,電場強度是從力的角度來描述電場,電勢差是從能量的角度來描述電場。

左值的定義:代表變數的表示式。 理解成左值是儲存單元(位址,容器),右值是值(內容)很合適。還有乙個概念就是左值轉換。

int a ,b;

a=1;//a左值,1右值。

b=2;//b左值,2右值。

a=b;//a左值,b左值。這個過程有乙個左值轉換的過程,b進行了左值轉化了

5樓:匿名使用者

左值就是在賦值中可以放在賦值操作符兩邊的值,比如:

int a = 1;

double b = 2.0

a = b;

b = a;

這裡a和b都是左值,一切變數都是左值,但const量是例外。

而右值則是只可以放在賦值操作符右邊的值,比如:

int a = 0;

char *b = "hello";

3 = a; // error

"howdy" = b // error

這裡3和"howdy"都是右值,所以不能放在賦值操作符左邊,一切常數、字元和字串都是右值。

6樓:

乙個賦值表示式:

x = y;

在這個表示式裡,符號x的含義是x所代表的位址,這被稱為左值,左值在編譯時可知,左值表示儲存結果的地方;

在這個表示式裡,符號y的含義是y所代表的位址的內容,這被稱為右值,右值在執行時才可知,如無特別說明,右值表示「y的內容」。

在《c專家程式設計(中文版)》中第4章,對左值和右值的基本描述,其餘的拓展描述你可以自己看。

7樓:

感覺一樓沒有回答樓主的問題,不嚴謹的講,左值右值的區分在於位於等號的那一側,左側的是左值,通常是乙個變數,右側的是右值,可以是乙個變數,或者是乙個表示式。

另外說明一下,i不僅是乙個表示式,它還是乙個變數,但是-i卻不是乙個變數,這是他們乙個可以自增乙個不能自增的根本原因

對於i++來說,i是乙個變數,所以是乙個左值,執行i=i+1但是對於(-i)++來說,-i是乙個表示式,而不是乙個變數,乙個表示式是不可以作為左值的,因為沒有辦法執行這條語句:-i=-i+1(-i+1的值不能附給-i,因為沒有-i這個變數儲存空間)

8樓:舒拔博士

先看什麼是表示式:

表示式由乙個或多個運算元通過操作符組合而成。最簡單的表示式僅包含乙個字面值常量或變數。較複雜的表示式則由操作符以及乙個或多個運算元構成。

再看什麼是左值:

c++ 中存在兩種表示式:左值可以出現在賦值語句的左邊或右邊。右值只能出現在賦值的右邊,不能出現在賦值語句的左邊。

c語言,關於左值,右值的概念問題

9樓:匿名使用者

1、例如:a[3] = 5;*p = 55;

2、非常量的變數空間可以寫入,自然就是左值了3、右值指的是常量或者比如算術運算的中間結果,只能讀出,不能寫入,當然就是右值了

一般而言,左值是可以作為右值的,左值的本意是只寫,右值的本意是唯讀

c語言中表示式必須是可修改的左值是什麼意思

10樓:匿名使用者

意思是賦值號左側的是只能是變數,不能是表示式。

通過變數名來訪問變數,是一種「相對安全」的方式。因為只有你定義了它,你才能夠訪問相應的變數。這就是對記憶體的基本認知。

但是,如果光知道這一點的話,其實還是不知道記憶體是如何存放變數的,因為底層是如何工作的,依舊不清楚。

要繼續深究的話,就需要把變數在記憶體中真正的樣子是什麼搞清楚。記憶體的最小索引單元是1位元組,那麼你其實可以把記憶體比作乙個超級大的「字元型陣列」。陣列是有下標的,我們是通過陣列名和下標來訪問陣列中的元素。

那麼記憶體也是一樣,只不過起了個新名字:位址。每個位址可以存放「1位元組」的資料,所以如果我們需要定義乙個整型變數,就需要佔據4個記憶體單元。

其實在程式執行的過程中,完全不需要變數名的參與。變數名只是方便進行**的編寫和閱讀,只有程式設計師和編譯器知道這個東西的存在。

而編譯器還知道具體的變數名對應的「記憶體位址」,這個是我們不知道的,因此編譯器就像乙個橋梁。當讀取某乙個變數的時候,編譯器就會找到變數名所對應的位址,讀取對應的值。

11樓:渺雪峰

意思是賦值號左側的是只能是變數,不能是表示式。

不能給常量賦值,不能給表示式賦值。

純手打,望採納、

C語言中基本資料型別有哪些,c語言簡單資料型別有哪些

void 宣告函式無返回值或無引數,宣告無型別指標,顯示丟棄運算結果。char 字元型版 型別資料權,屬於整型資料的一種。int 整型資料,表示範圍通常為編譯器指定的記憶體位元組長。float 單精度浮點型資料,屬於浮點資料的一種。double 雙精度浮點型資料,屬於浮點資料的一種。bool 布林型...

C語言中訪問資料庫的類有哪些,c 中連線資料庫的類怎麼寫呀

c 訪問資料庫一般都是ado.net,要使用的類要看你是什麼資料庫,詳細可以去msdn上了解吧 c 中連線資料庫的類怎麼寫呀?可以選擇封裝到類庫里,這個你可以參考微軟petshop設計裡的,sqlhelp類。可以手寫,需要重寫幾個方法。可以用生成器生成資料庫連線類,相當規範 有包括microsoft...

C語言中怎樣用二維陣列輸出5 5的資料的左下三角資料

倒黴熊 原先的陣列為 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 輸出左下角 16 7 11 12 13 16 17 18 19 21 22 23 24 25 程式如下 include int main int ...