[c/c++] i++与++i的区别
程序员文章站
2022-07-14 07:56:41
...
主要区别
- 值的区别
- 左值右值区别
- 效率区别
实现代码
下面以郭炜老师c++课程中的一段代码为例
类定义
class cDemo
{
private:
int n;
public:
cDemo(int i) : n(i) {}
cDemo& operator++(); // 前置++
cDemo operator++(int); // 后置++
};
前置++
cDemo& cDemo::operator++()
{
++n;
return *this;
}
后置++
cDemo cDemo::operator++(int)
{
cDemo tmp(*this); // 赋值时调用拷贝构造函数
n++;
return tmp; // 返回时调用拷贝构造函数
}
1.值的区别
由上面的例子可见:
前置++,即++i,先自增再返回,返回的值已经+1;
后置++,即i++,先保存自增前的值,然后自增,最后返回自增前的值,返回的值未+1。
2.左值右值区别
前置++,返回的是引用,属于左值,可被赋值,可取地址
后置++,返回本身类型,属于右值,不可被赋值,不可取地址
ps:下面这段代码g++可以编译通过,gcc编译报错
i++_++i.c:8:26: error: lvalue required as unary ‘&’ operand
printf("&(++i) : %p\n", &(++i));
#include <stdio.h>
int main()
{
int i = 7;
printf("&i : %p\n", &i);
printf("&(++i) : %p\n", &(++i));
// printf("&(i++) : %p\n", &(i++));
++i = 2;
printf("++i = 2 : %d\n", i);
// i++ = 2;
return 0;
}
3.效率区别
对于自定义类重载的自增运算符:
前置++,直接返回引用本身,效率较高
后置++,需要调用两次拷贝构造函数,效率较低
系统内置类型自增运算符,如int
效率几乎无差别
参考阅读
[1] 自增自减运算符的重载-郭炜
[2] ++i、i++、i+=1、i=i+1的区别-白夜行的狼
[3] 在程序开发中,++i 与 i++的区别在哪里?-知乎