1. 表达式的值不同(这一点想必大多数人都记得)
即++i,i的值自增后,返回i自增后的值; i++,i的值自增,返回的却是i自增前的值
内部具体操作可以看作是这样的
/**
前置自增
*/
{
i = i+1;
return i;
}
/**
后置自增
*/
{
int temp = i;
i = i+1;
return temp;
}
如上所示,后置自增除了返回值与前置自增不同以外,还多了一个创建临时对象的步骤,这也就是为什么会有前置自增比后置自增更高效的说法,但据说如果只是像 i 这样简单的对象,现在的编译器都会自动优化,所以两者不会有什么区别。
2. 前置自增的表达式是一个左值,而后置自增表达式是一个右值。
何谓左值、右值呢,简单理解就是可以放在赋值号左边的就是左值,不能放在赋值号左边的就是右值
据说还有一个判定方法是其前面可以使用取地址符(&)的就是左值,否则是右值
举个例子
int i = 6;
++i = 1; //合法, 最终i的值为1
i++ = 1; //非法