欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-07-14 07:56:41
...

主要区别

  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++的区别在哪里?-知乎

相关标签: c/c++