左值和右值的區別,什麼是左值?

時間 2023-08-10 16:53:43

1樓:巧維

在c語言學習過程中,大家或許聽到過左值和右值的概念,甚至在除錯程式時編譯器也會給出” left operand must be l-value ” 即左運算元必須為左值!,今天我們將為大家詳細解釋這兩個詞,以及兩者的區別!

簡單而言,在賦值運算子“=”左邊的就是左值,在賦值運算子“=”後邊的就是右值,感覺像是廢話,但非常好理解。但更多時候,我們是為了學習和理解不同情況下左值和右值的區別,下面來舉例依次說明,著層深入,來讓大家解渴!

1.變數做左值和右值的區別:

如 x = 2;

這裡x為整形變數,這裡作為左值,代表的是一塊記憶體單元,表示的是地址。

再如x = y;

現在看變數做右值情況,y做右值,這裡呢就不在表示地址,而是代表該記憶體單元上的值!然後賦給x。

2.常量做左值和右值的區別:

繼續 x = 2;

這裡2做右值, 2是一個常量,沒有任何疑問。

而如果 1 = 2;

這裡我們看左值,是1是常量,這裡就會有問題了,編譯會報錯!因為常量不可被修改、不可以被賦值!所以大家可能會聽過或見過”可修改/不可修改的左值”。

3.陣列名做左值和右值的區別:

例如有字元陣列char a[100];

當a做右值時候,我們可以把它賦給char *型別的指標,用來指向這個陣列,這種情況下陣列名做右值代表該陣列首元素的首地址,是常量,是完全可以的。

而陣列名無論右值和還是左值,都代表是地址,是常量,因此它不可以做左值,因為常量不可被修改!所以不少同學試圖再定義陣列之後再試圖對陣列賦字串都是錯誤的!

4.字串常量做右值。

字串常量想必大家都很清楚,是用雙引號括起來的字串,既然也是常量,也理所當然不可以做左值,但做右值呢?

答案是,會表示該字串在記憶體中儲存位置的首地址。就就是char * p = 用法的原因。

2樓:數碼王子胖

左值(lvalue)和右值(rvalue)最先**於編譯。在c語言中表示位於賦值運算子兩側的兩個值,左邊的就叫左值,右邊的就叫右值。

定義:左值指的是如果一個表示式可以引用到某一個物件,並且這個物件是一塊記憶體空間且可以被檢查和儲存,那麼這個表示式就可以作為一個左值。

右值指的是引用了一個儲存在某個記憶體地址裡的資料。

從上面的兩個定義可以看出,左值其實要引用一個物件,而一個物件在我們的程式中又肯定有一個名字或者可以通過一個名字訪問到,所以左值又可以歸納為:左值表示程式中必須有一個特定的名字引用到這個值。而右值引用的是地址裡的內容,所以右值又可以歸納為:

右值表示程式中沒有一個特定的名字引用到這個值。

a的話因為返回結果和運算之後的a一樣,所以++a返回的是真實的a,可以被重新賦值,所以可以作為左值。而a++返回的是運算之前的a,而此時a已經+1了,返回的資料其實是過去的a,它是另外複製出來的,而不是真正的a,所以無法被賦值,所以它只能是右值。

所以a++;在執行當中的順序是,先把a的值複製出來,進行整體運算,然後再a=a+1。

什麼是左值?

3樓:商靈秀靳問

是賦值運算子,它的作用是將一個表示式的值賦給一個左值。一個表示式或者是一個左值,或者是一個右值。所謂左值是指一個能用於賦值運算左邊的表示式。

左值必須能夠被修改,不能是常量。這裡是用變數作左值,指標和引用也可以作左值。例如:

inta,b,c;

a=3;b=4;ca

b*(2*ab)

得出14

什麼是左值?左值和右值的區別

c 語言中可以放在等號左邊的變數,即具有對應的可以由使用者訪問的儲存單元,並且能夠由使用者去改變其值的量。或者說左值是代表一個記憶體地址值,通過這個記憶體地址,就可以對記憶體進行讀寫操作 這也就是為什麼左值可以被賦值的原因了。相對應的還有右值 當一個符號或者常量放在操作符右邊的時候,計算機就讀取他們...

左值和右值的區別,什麼是左值?

在c語言學習過程中,大家或許聽到過左值和右值的概念,甚至在除錯程式時編譯器也會給出 left operand must be l value 即左運算元必須為左值!今天我們將為大家詳細解釋這兩個詞,以及兩者的區別!簡單而言,在賦值運算子 左邊的就是左值,在賦值運算子 後邊的就是右值,感覺像是廢話,但...

左值和右值的區別,什麼是左值?

在c語言學習過程中,大家或許聽到過左值和右值的概念,甚至在除錯程式時編譯器也會給出 left operand must be l value 即左運算元必須為左值!今天我們將為大家詳細解釋這兩個詞,以及兩者的區別!簡單而言,在賦值運算子 左邊的就是左值,在賦值運算子 後邊的就是右值,感覺像是廢話,但...