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 ...