1. 程式人生 > >a++ 和 ++a 的區別

a++ 和 ++a 的區別

可見 定義 存儲 表達 return 它的 存在 ati 常量

a++ 和 ++a 的區別

1)首先說左值和右值的定義:
變量和文字常量都有存儲區,並且有相關的類型。區別在於變量是可尋址的(addressable)對於每一個變量都有兩個值與其相聯:
1).它的數據值,存儲在某個內存地址中。有時這個值也被稱為對象的右值(rvalue,讀做are-value).我們也可認為右值的意思是被讀取的值(read value)。文字常量和變量都可被用作右值
2).它的地址值——即存儲數據值的那塊內存的地址。它有時被稱為變量的左值(lvalue,讀作ell-value)。我們也可認為左值的意思是位置值(location value)。文字常量不能被用作左值

(2) 首先對於a++的實現是:
int temp;
temp = a;
a = a+1;
return temp; // 返回的是編譯器自動分配的臨時變量temp,而這個temp並不是你程序中定義的可尋址變量的引用 ,也就是說你不能通過地址對temp進行操作.(換句話說就是不能作為左值),因為temp是一個臨時變量。

而++a的實現是:
a = a+1;
return a; // 返回值就是a

所以 a++ = 5 是錯誤的。而 ++a = 5 是正確的。

a++和++a在做左值的時候有不同,那麽左值它首先必須是有特定地址的才能作為左值,否則賦值就沒有具體對象。
a++的意思是先復制一份臨時數據出來參與周邊環境的運算,再自加變量a,可見a++用來參與運算的是一份復制出來的臨時數據,這個數據是臨時存在而沒有固定地址的,不是一個真正的變量。
++a的意思是先自加變量a,再將變量放到周邊環境參與運算,那麽++a用來參與運算的是有具體地址的變量,所以++a是可以作為左值使用的。
在具體一點可以理解為:
a++返回一個臨時變量
++a返回變量的引用

a++,a自增1,返回a自增之前的值(右值)
++a,a自增1,返回自增之後的a(左值)
你需要自己明確三個概念:表達式的返回值、左值、右值

a++ 和 ++a 的區別