i 為什麼不能作為左值,而 i可以作為左值

2022-06-28 15:33:11 字數 1329 閱讀 5044

今天看書見到如下**:

int a=2;

++a++;

根據操作符的優先順序和結合性知,操作符++的優先順序為3,結合性為右結合,即++a++;可以理解為++(a++);

但我把**放在vs2015上,結果報錯,如圖:

意思就是所a++不能作為左值,那a++為什麼不能作為左值呢?我們先來看左值的定義:

左值(lvalue) 是b語言/c語言/c++語言等類c語言中的一類表示式。「左」(left)的原意是指可以放在賦值符號「=」的左邊,但其實也表示能作為&和++等操作符的運算元(b語言中已經如此)。左值不但具有空間實體,還具有讀寫訪問權。

現在我們來看a++的實現:

int temp;

temp=a;

a=a+1;

return temp;

因為a++返回的是編譯器自動分配的臨時變數temp,而這個temp並不是你程式中定義的可定址變數的引用 ,也就是說你不能通過位址對它進行操作.(換句話說就是不能作為左值)。

而++a的實現為:

a=a+1;

return a;

因為++a返回的是a,它是程式中定義的可定址變數的引用,所以它可以作為左值。

附加:++與--是連體操作符,中間不能有空格。如果有多於兩個的+或-連寫,則編譯器按「貪吃法則」理解。所謂貪吃,是指只要能理解(能成為操作符),就盡量多讀入字元。例如:

(1)int a=1, b=5, c;

(2)c = a + b;            //ok

(3)c = a ++ b;          //錯:a++和b兩個表示式,缺乏相運算的操作符

(4)c = a +++ b;        //ok:a++ +b;

(5)c = a ++++ b;      //錯:a++和++b兩個表示式,缺乏相運算的操作符

(6)c = a +++++ b;    //錯:a++ ++ +b,a++非左值,不能++

根據「貪吃法則」,上面第3行,編譯器不會理解成a + +b;同樣第5行也不會理解成a++ + +b;以及第6行也不會理解成a++ + ++b;編譯器對表示式的理解是沒有二義性的。如果要使上面的非法**可行,只能通過書寫格式人為控制表示式的意義,如下**:

#include

using namespace std;

int main()

結果為:

為什麼 i 不能做左值,而 i 可以

算下來已經很久以前了,大概有那麼幾個星期了吧。看到了帖子上有人問為什麼下面的語句的對錯原因 int i 0 int ip i 錯誤 int ip i 正確 看到上面的語句,當時以為兩個都是是對的啊,可是當我用vs2010的編譯器試了試之後,才發現第乙個取位址確實是錯誤的語句,具體的提示是 error...

為什麼 i 不能做左值,而 i 可以

算下來已經很久以前了,大概有那麼幾個星期了吧。看到了帖子上有人問為什麼下面的語句的對錯原因 int i 0 int ip i 錯誤 int ip i 正確 看到上面的語句,當時以為兩個都是是對的啊,可是當我用vs2010的編譯器試了試之後,才發現第乙個取位址確實是錯誤的語句,具體的提示是 error...

i 為什麼不能作為左值?

1 首先說左值和右值的定義 變數和文字常量都有儲存區,並且有相關的型別。區別在於變數是可定址的 addressable 對於每乙個變數都有兩個值與其相聯 1 它的資料值,儲存在某個記憶體位址中。有時這個值也被稱為物件的右值 rvalue,讀做are value 我們也可認為右值的意思是被讀取的值 r...