[c/c++] i++与++i的区别

主要区别

  1. 值的区别
  2. 左值右值区别
  3. 效率区别

实现代码

下面以郭炜老师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++的区别在哪里?-知乎

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值