(a )為什麼不對呢?我來告訴你!

2021-10-20 18:07:33 字數 1575 閱讀 4777

今天在牛客網刷題時遇到了一道題目,剛開始我不知道為什麼錯了,後來查詢了資料就理解了。

a錯誤,因為a++操作通過臨時量返回其值,該值是乙個常量,因此不能被修改(不是左值),而字尾++需要對左值進行操作,所以會引起編譯錯誤。

所謂的左值,說通俗一點就是可以被修改和引用的值,左值可以取位址。與之相對的就是右值。在使用時,左值可以作為右值,但右值不能作為左值。

b、d的錯誤在於無法劃分為有效的c/c++運算子

c當然是對的,至於是看作(a++)+b還是a+(++b),個人傾向於前者。因為在計算表示式時,應保證整個表示式的結合性一致。當遇到結合性不一致的情況時,一般會以圓括號包裹處理。這裡+運算子為左結合性,字首++為右結合性,字尾++為左結合性(c++中字尾運算子和單目運算子不僅優先順序不同,結合性也不同,字首++是單目運算子),所以從保持結合性一致出發,個人認為此處應看作(a++)+b。如果需要作為第二種表示,則需要新增圓括號。

在c++中,乙個左值是指向乙個指定記憶體的東西。另一方面,右值就是不指向任何地方的東西。通常來說,右值是暫時和短命的,而左值則活的很久,因為他們以變數的形式(variable)存在。我們可以將左值看作為容器(container)而將右值看做容器中的事物。如果容器消失了,容器中的事物也就自然就無法存在了。

讓我們現在來看一些例子:

int x = 666; //ok
在這裡,666是乙個右值。乙個數字(從技術角度來說他是乙個字面常量(literal constant))沒有指定的記憶體位址,當然在程式執行時一些臨時的暫存器除外。在該例中,666被賦值(assign)給x,x是乙個變數。乙個變數有著具體(specific)的記憶體位置,所以他是乙個左值。c++中宣告乙個賦值(assignment)需要乙個左值作為它的左運算元(left operand):這完全合法。

對於左值x,你可以做像這樣的操作:

int* y = &x;  //ok
在這裡我通過取位址操作符&獲取了x的記憶體位址並且把它放進了y。&操作符需要乙個左值並且產生了乙個右值,這也是另乙個完全合法的操作:在賦值操作符的左邊我們有乙個左值(乙個變數),在右邊我們使用取位址操作符產生的右值。

然而,我們不能這樣寫:

int y;

666 = y; //error!

可能上面的結論是顯而易見的,但是從技術上來說是因為666是乙個字面常量也就是乙個右值,它沒有乙個具體的記憶體位置(memory location),所以我們會把y分配到乙個不存在的地方。

a++的意思是先複製乙份臨時資料出來參與周邊環境的運算,再自加變數a,可見a++用來參與運算的是乙份複製出來的臨時資料,這個資料是臨時存在而沒有固定位址的,不是乙個真正的變數。++a的意思是先自加變數a,再將變數放到周邊環境參與運算,那麼++a用來參與運算的是有具體位址的變數,所以++a是可以作為左值使用的。

在具體一點可以理解為:

a++返回乙個臨時變數

++a返回變數的引用

a++的結果是a值的拷貝,而不是變數本省,你無法向乙個值進行賦值

為什麼學python,讓我來告訴你

python是一種代表簡單主義思想的語言,閱讀乙個良好的python程式就感覺像是在讀英語一樣,它使你能夠專注於解決問題而不是去搞明白語言本身,python有極其簡單的語法容易 依靠著python內建的庫及其強大的第三方庫,python幾乎在任何的領域都可以發光發熱,如果把程式語言當作 那麼pyth...

我來告訴你 python wheel 是什麼

wheel 是新的 python 的 disribution,用於替代 python 傳統的 egg 檔案。目前有超過一半的庫檔案有對應的 wheel 檔案。whl檔案有一點與.egg檔案相似 實際上它們都是 偽裝的 zip檔案。如果你將.whl檔名擴充套件改為 zip,你就可以使用你的zip應用程...

人工智慧是什麼?我來告訴你!

為推動我國人工智慧規模化應用,全面提公升產業發展智慧型化水平,2017年7月20日,印發了 新一代人工智慧發展規劃 並將在製造 金融 農業 物流 商務 家居等重點行業和領域開展人工智慧應用試點示範工作。就金融行業而言,規劃 指出,要在智慧型金融方面,建立金融大資料系統,提公升金融多 資料處理與理解能...