如何理解左運算元必須為左值

2021-08-28 12:59:05 字數 1720 閱讀 4122

宣告:本博文用於學習總結及工作心得

在c語言中經常會遇到乙個問題就是做運算元必須為左值,看一下**:

int a=1,b=2;

a在c++編譯器環境下,能正常執行,沒有錯誤,但是在c編譯器下卻會報錯:

error c2106 「=」:做運算元必須為左值

什麼是左值?

首先需要明白什麼是表示式:

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

什麼是左值: 

不嚴謹的說法是,左值右值的區分在於位於等號的那一側,左側的是左值,通常是乙個變數,右側的是右值,可以是乙個變數,或者是乙個表示式。

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

a將**修改一下:

*( a < b ? &a : &b ) = 10;  這樣表示式返回的是乙個*(a的位址或者b的位址) 相當於*p;再通過*取位址,操作位址所指向的記憶體空間進行間接賦值

左值在編譯時可知,左值表示儲存結果的地方,所以簡單理解,左值就是必須有儲存結果的地方,有記憶體空間;至於c++可以執行成功是因為c++編譯器已經優化過,表達事返回的並不是a的內容(b的內容)  ,而是乙個變數 ;

特別是操作符過載時,進行鏈式程式設計時:

自定義型別aa

class aa

private :

int a,b;

public:

aa(int a,int b)

this->a = a;

this->b = b;

friend void operator <<(ostream &out, aa &a1);

aa a1( 1, 2);

cout << a1 ;

cout << a1 << endl;

過載函式為:

void operator <<(ostream &out, aa &a1 )

cout<< a1.a << a1.b;

return;

這裡的做操作是cout 

這時候 執行 cout << a1 ;沒有錯誤

執行下面一句 cout << a1 << endl; 編譯器報錯: 左運算元必須為左值

首先 cout << a1 返回 void ;void << endl; void 不能充當做運算元,而且必須要ostream 型別的物件做引數;所以需要返回乙個物件的引用(函式返回值當左值時,必須返回乙個物件的應用 )

所以需要講函式返回值修改為 ostream& 

ostream& operator <<(ostream &out, aa &a1 )

cout<< "我是cout << 過載函式" << endl;

cout<< a1.a << "," << a1.b;

return;

記得類中宣告友員函式的地方,也需要修改函式返回值;修改後:

class aa

private :

int a,b;

public:

aa(int a,int b)

this->a = a;

this->b = b;

friend ostream& operator <<(ostream &out, aa &a1);

執行後返回

我是cout << 過載函式

1,2

c語言中出現左運算元必須是左值(摘抄)

在做c語言聯絡的時候,總是會出現左運算元必須是左值,左值就是在賦值中可以放在賦值操作符兩邊的值,比如 int a 1 double b 2.0 a b b a 這裡a和b都是左值,一切變數都是左值,但const量是例外。p是乙個左值,和變數一樣,只要在 p的右邊加上賦值運算子,就可改變 p的值。如果...

C C 引用必須為左值的問題詳解

我們常常會遇到這樣的問題 const int a 101 對 int b 101 錯 例子 int a int b a a 10 printf b d n b 此時b 10,b是a的引用,就是說b和a的位址相同,對a做改變b也跟著變化。那麼這是為什麼呢?下面我們來講乙個概念 左值和右值?左值和右值都...

非常量引用的初始值必須為左值

今天碰到了這個問題,回顧一下概念 左值與右值 根據c primer第五版,當乙個物件被用作右值的時候,用的是物件的值,當物件被用作左值的時候,用的是物件的身份 下面這個函式就是正確的 includeint function int a int main 而這個就是錯誤的 includeint fun...