日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

如何理解左操作数必须为左值

發(fā)布時間:2024/4/19 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何理解左操作数必须为左值 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

本文轉(zhuǎn)載自 : _Hebrew博客
聲明:本博文用于學習總結(jié)及工作心得

在C語言中經(jīng)常會遇到一個問題就是做操作數(shù)必須為左值,看一下代碼:

int a=1,b=2;a<b?a:b=10;

在C++編譯器環(huán)境下,能正常運行,沒有錯誤,但是在C編譯器下卻會報錯:

error C2106 “=”:做操作數(shù)必須為左值

什么是左值?

首先需要明白什么是表達式:

表達式由一個或多個操作數(shù)通過操作符組合而成。最簡單的表達式僅包含一個字面值常量或變量。較復雜的表達式則由操作符以及一個或多個操作數(shù)構(gòu)成。

什么是左值:

不嚴謹?shù)恼f法是,左值右值的區(qū)分在于位于等號的那一側(cè),左側(cè)的是左值,通常是一個變量,右側(cè)的是右值,可以是一個變量,或者是一個表達式。

C++ 中存在兩種表達式:左值可以出現(xiàn)在賦值語句的左邊或右邊。右值只能出現(xiàn)在賦值的右邊,不能出現(xiàn)在賦值語句的左邊。

a<b?a:b

是一個表達式,返回的是a的值或者b的值,并不是一個變量,常數(shù)不是變量(變量:一段連續(xù)內(nèi)存空間的別名),所以10不能賦值給一個常數(shù)(常數(shù)是恒定不變的,一切常數(shù)、字符和字符串都是右值),沒有存儲結(jié)果的空間,也就不能賦值;

將代碼修改一下:

*( a < b ? &a : &b ) = 10;

這樣表達式返回的是一個(a的地址或者b的地址) 相當于*p;再通過取地址,操作地址所指向的內(nèi)存空間進行間接賦值

左值在編譯時可知,左值表示存儲結(jié)果的地方,所以簡單理解,左值就是必須有存儲結(jié)果的地方,有內(nèi)存空間;至于C++可以運行成功是因為C++編譯器已經(jīng)優(yōu)化過,表達事返回的并不是a的內(nèi)容(b的內(nèi)容) ,而是一個變量 ;

特別是操作符重載時,進行鏈式編程時:

//自定義類型AAclass 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;//重載函數(shù)為:void operator <<(ostream &out, AA &a1 ) {cout<< a1.a << a1.b;return; }

這里的做操作是cout

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

運行下面一句 cout << a1 << endl; 編譯器報錯: 左操作數(shù)必須為左值

首先 cout << a1 返回 void
而后就有 void << endl; void 不能充當做操作數(shù),而且必須要ostream 類型的對象做參數(shù);所以需要返回一個對象的引用(函數(shù)返回值當左值時,必須返回一個對象的應(yīng)用 )

所以需要講函數(shù)返回值修改為 ostream&

ostream& operator <<(ostream &out, AA &a1 ) {cout<< "我是cout << 重載函數(shù)" << endl;cout<< a1.a << "," << a1.b;return; }

記得類中聲明友員函數(shù)的地方,也需要修改函數(shù)返回值;修改后:

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

運行后返回
我是cout << 重載函數(shù)
1,2
這樣就正確輸出了


補充 : 左值這個名詞,之前一直認為必須是個可以被賦值的的東西
也就是必須有自己的空間可以賦值,
看了這篇博文之后,也有了更加深入的理解,也是知道了右值這個東西

這里引用一句:

(常數(shù)是恒定不變的,一切常數(shù)、字符和字符串都是右值),沒有存儲結(jié)果的空間,也就不能賦值;

總結(jié)

以上是生活随笔為你收集整理的如何理解左操作数必须为左值的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。