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


  今天看書見到如下代碼:

  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<iostream>
  using namespace std;
  int main() {
     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;
    return 0;
  }
結果為:

 

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM