int i = 0;
int *ip = &(i++); //錯誤
int *ip = &(++i); //正確
看到上面的語句,當時以爲兩個都是是對的啊,可是當我用VS2010的編譯器試了試之後,才發現第一個取地址確實是錯誤的語句,具體的提示是:error C2102: “&”要求左值,而第二個取地址是正確的。
也就是說取地址符"&"作用的對象必須是一個左值,左值的概念是什麼呢?看一下百度對於C/C++中左值的定義:
左值:
C/C++語言中可以放在賦值符號左邊的變量,即具有對應的可以由用戶訪問的存儲單元,並且能夠由用戶去改變其值的量。左值表示存儲在計算機內存的對象,而不是常量或計算的結果。或者說左值是代表一個內存地址值,並且通過這個內存地址,就可以對內存進行讀並且寫(主要是能寫)操作;這也就是爲什麼左值可以被賦值的原因了。相對應的還有右值:當一個符號或者常量放在操作符右邊的時候,計算機就讀取他們的“右值”,也就是其代表的真實值。簡單來說就是,左值相當於地址值,右值相當於數據值
看完左值的定義就不難理解爲什麼取地址運算符需要作用在一個左值對象上了。可爲什麼i++與++i有如此的區別呢?
原因是:i++不是存儲在x中的值,他們的具體函數實現請看下面:
int& int::operator++() //這裏返回的是一個引用形式,就是說函數返回值也可以作爲一個左值使用
{//函數本身無參,意味着是在自身空間內增加1的
*this += 1; // 增加
return *this; // 取回值
}
const int int::operator++(int) //函數返回值是一個非左值型的,與前綴形式的差別所在。
{//函數帶參,說明有另外的空間開闢
int oldValue = *this; // 取回值
++(*this); // 增加
return oldValue; // 返回被取回的值
}