i++ 与 ++i 的主要区别有两个:
1、 i++ 的返回值为原值,++i 返回值是加1后的值。
2、 i++ 不能作为左值,而++i 可以。
i++ 与 ++i 定义的比较
前缀形式 ++i 定义
//这里返回的是一个引用形式,就是说函数返回值也可以作为一个左值使用
int& int::operator++()
{
//函数本身无参,意味着是在自身空间内增加1的
*this += 1; // 自增加1
return *this; // 取回当前自身的值(+1后的值)
}
后缀形式 i++ 定义
//函数返回值是一个非左值型的,与前缀形式的差别所在
const int int::operator++(int)
{
//函数带参,说明有另外的空间开辟
int oldValue = *this; // 取回值
++(*this); // 自增加1
return oldValue; // 返回被取的值
}
AT&T汇编比较
前缀形式 ++i
movl $1, 28(%esp)
addl $1, 28(%esp) //“与”运算
movl 28(%esp), %eax //计算结果赋值给eax寄存器
movl %eax, 4(%esp)
后缀形式 i++
movl $1, 28(%esp)
movl 28(%esp), %eax //直接赋值给eax寄存器,没有经过运算
leal 1(%eax), %edx
movl %edx, 28(%esp)
movl %eax, 28(%esp)
movl 28(%esp), %eax