1. 程式人生 > >i++與++i區別

i++與++i區別

i++與++i主要區別有兩個:

1)i++返回加1前的值,++i返回加1後的值;

2)i++不能作為左值,而++i可以。

注:★左值是對應記憶體中有確定儲存地址的物件的表示式的值,而右值是所有不是左值的表示式的值。(引用自中文維基百科【左值引用】)

       ★能否被賦值不是區分左值與右值的依據。比如,C++的const左值是不可賦值的;而作為臨時物件的右值可能允許被賦值。左值與右值的根本區別在於是否允許取地址&運算子獲得相應的記憶體地址

舉個栗子:

1. 是否允許取地址

#include <iostream>
using namespace std;

int main()
{
	int i = 1;
	int* p1 = &(++ i);    //正確
	int* p2 = &(i ++);    //錯誤
	return 0;
}

可見,i++無法取得相應的記憶體地址。

2. 返回值

#include <iostream>
using namespace std;

int main()
{
	int i = 1;
	++ i = 4;    //正確
	i++ = 5;     //錯誤
	return 0;
}

可見,++ i可以作為左值。

為什麼++i可以作為左值,而i++不可以,參見其具體實現:

// 字首形式:
int& int::operator++()    //這裡返回的是一個引用形式,即函式返回值也可以作為一個左值使用
{//函式本身無參,意味著是在自身空間內增加1的
  *this += 1;  // 增加
  return *this;  // 取回值
}

//字尾形式:
const int int::operator++(int) //函式返回值是一個非左值型的,與字首形式的差別所在。
{//函式帶參,說明有另外的空間開闢
  int oldValue = *this;  // 取回值
  ++(*this);  // 增加
  return oldValue;  // 返回被取回的值
}

注:i++最後返回的是一個臨時變數,而臨時變數是右值

3. const