今天看書見到如下代碼:
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;編譯器對表達式的理解是沒有二義性的。如果要使上面的非法代碼可行,只能通過書寫格式人為控制表達式的意義,如下代碼:
using namespace std;
int a = 1, b = 5, c;
c = a + +b;
cout << c << endl;
c = a++ +b;
cout << c << endl;
c = a++ + +b;
cout << c << endl;
c = a+ ++++b;
cout << c << endl;
}
