宣告:本博文用於學習總結及工作心得
在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...