作者简介:Codebowl靓仔,学妹的工具人,C++开发误入数据开发,梦想30岁退休的靓仔就是我啦。

i++和++i对于初学者来说,一直是一个特别容易搞混的内容,相信很多人现在也没有完全搞清(作者初学的时候就一直稀里糊涂的,老师在讲这个的时候也一笔带过了)。
不过今天不用怕,看完这篇文章,相信你一定能搞清楚这俩个的区别!

一文带你彻底搞懂i++和++i的区别,谁的效率更高?

  • 基本概念
  • ++i和i++的区别
  • i++和++i的原理
    • 单独使用时
    • 参与运算时
  • i++和++i那个效率更高?

基本概念

两者的作用都是自增加1。
单独拿出来说的话,++i和i++,效果都是一样的,就是i=i+1。

int main()
{int i = 0;i++;
}
int main()
{int i = 0;++i;
}

最后的结果都是1。

那么它们的区别又体现在什么地方呢?
请继续往下看!

++i和i++的区别

单独使用的时候是没有区别的,但是如果当成运算符,就会有区别了!
如图所示,我们用a=i++和a=++i举例说明

1.先说a=i++,这个运算的意思是先把i的值赋予a,然后在执行i=i+1;

  • 当i初始等于3时,执行a=i++,最终结果a=3,i=4.

2.而a=++i,这个的意思是先执行i=i+1,然后在把i的值赋予a;

  • 当i初始等于3时,执行a=++i,最终结果a=4,i=4.


所以说两者参与运算时的区别就是:

  1. a=i++ , a 返回原来的值a=i,i=i+1;
    a=++i , a 返回加1后的值,a=i+1,i=i+1。
    也就是i++是先赋值,然后再自增;++i是先自增,后赋值。
  2. 第二个区别就是: i++ 不能作为左值,而++i可以。

i++和++i的原理

实现原理我们要分俩部分看,因为单独使用和参与运算时是不一样的。

单独使用时

通过下图汇编代码所示,单独使用时,都是先进性加法,在进行赋值,所以体现出来的结果是一样的。

参与运算时

我们通过汇编代码,就可以很清楚地看到两者的不同了。
a=i++,先将i赋值给了a,然后才进行了+1操作,把加1结果赋值给了i。
b=++i,先进行加1操作,然后将加1结果先赋值给i,在赋值给了b。

其实,看汇编代码是学习C++的一个很好的方法,当我们对于某些实现原理存在疑惑的时候,就可以通过看汇编代码来学习!

i++和++i那个效率更高?

我们通过上面的两张图,单独使用的时候,两者没有区别,参与运算时,也不过是语句的执行顺序换了,但是执行的步骤是一样的,效率都是一样的啊,没有什么不同啊?


有这个疑问的小伙伴已经发现了在简单使用的时候,确实俩者的效率是没有什么不同的!
(之前存在的说法是++i比i++的效率高,但是当编译器优化之后,两者简单应用时的效率确实是没有什么不同的)

但是,答案是两者效率在某些情况下仍有不同!
当我们考虑自定义类的时候,就不一样了。
i++是先用临时对象保存原来的对象,然后对原对象自增,再返回临时对象,不能作为左值;++i是直接对于原对象进行自增,然后返回原对象的引用,可以作为左值。
由于要生成临时对象,i++需要调用两次拷贝构造函数与析构函数(将原对象赋给临时对象一次,临时对象以值传递方式返回一次);
++i由于不用生成临时变量,且以引用方式返回,故没有构造与析构的开销,效率更高。
所以在使用类等自定义类型的时候,应尽量使用++i。

实验证明:

#include<iostream>
using namespace std;class increment {int x_;int y_;
public:increment(int x = 0, int y = 0);increment(const increment&);~increment();increment& operator++();//前置const increment operator++(int);//后置increment operator+(const increment&);increment& operator+=(const increment&);void Displayincrement();
};increment& increment::operator+=(const increment& _right)
{this->x_ += _right.x_;this->y_ += _right.y_;return *this;
}increment increment::operator+(const increment& _right)
{increment temp;temp.x_ = this->x_ + _right.x_;temp.y_ = this->y_ + _right.y_;return temp;
}increment& increment::operator++()
{++x_;++y_;return *this;
}const increment increment::operator++(int)
{increment temp(*this);this->x_++;this->y_++;return temp;
}increment::increment(int x, int y)
{x_ = x;y_ = y;cout << "this is constructor" << endl;
}increment::increment(const increment& b)
{this->x_ = b.x_;this->y_ = b.y_;cout << "this is copy constructor" << endl;
}increment::~increment()
{cout << "this is destructor" << endl;
}void increment::Displayincrement()
{cout << "x: " << this->x_ << endl;cout << "y: " << this->y_ << endl;
}int main()
{increment i(1, 1);cout << endl << "this is i++: " << endl;i++;cout << endl << "this is ++i: " << endl;++i;
}

运行结果:
可以看到,i++将会有两次的拷贝构造与析构的调用,效率非常低。

总结如下:

  1. 简单使用时,俩这效率没有什么区别!
  2. 对于自定义类型,在类里使用的时候,++i的效率更高!

Codebowl是个靓仔,快要毕业的大四仔。
希望可以帮助到您,喜欢的话,可以给个关注收藏或点赞哦,有不懂或发现错误的可以在评论区或私信交流哦!

一文带你彻底搞懂i++和++i的区别,谁的效率更高?相关推荐

  1. lambda表达式java项目常用_一文带你彻底搞懂Lambda表达式

    1. 为什么使用Lambda表达式 Lambda是一个匿名函数,我们可以把Lambda表达式理解为是一段可以传递的代码(将代码像数据一样进行传递).可以写出更简洁.更灵活的代码.作为一种更紧凑的代码风 ...

  2. 2.1.5 校验码(一文带你分析搞懂:奇偶校验码、海明码、CRC码)

    文章目录: 什么是校验码? 为什么要有校验码? 1.奇偶校验码 怎么通过奇偶校验码判断数据是正确还是错误呢? (1)奇校验 (2)偶校验 为什么无法检查出偶数个错误? 2.海明(汉明)校验码 什么是海 ...

  3. 一文带你你搞懂索引如何优化!!!

    前言 索引的相信大家都听说过,但是真正会用的又有几人?平时工作中写SQL真的会考虑到这条SQL如何能够用上索引,如何能够提升执行效率? 此篇文章详细的讲述了索引优化的几个原则,只要在工作中能够随时应用 ...

  4. C++微服务RPC框架,一文带你彻底搞懂 RPC

    RPC(Remote Procedure Call),是一个大家既熟悉又陌生的词,只要涉及到通信,必然需要某种网络协议.我们很可能用过HTTP,那么RPC又和HTTP有什么区别呢?RPC还有什么特点, ...

  5. 一文带你彻底搞懂Docker中的cgroup

    前言 进程在系统中使用CPU.内存.磁盘等计算资源或者存储资源还是比较随心所欲的,我们希望对进程资源利用进行限制,对进程资源的使用进行追踪.这就让cgroup的出现成为了可能,它用来统一将进程进行分组 ...

  6. 面试都在问的微服务,一文带你彻底搞懂!

    来自:后端技术学堂 单体式应用程序 与微服务相对的另一个概念是传统的「单体式应用程序」( Monolithic application ),单体式应用内部包含了所有需要的服务.而且各个服务功能模块有很 ...

  7. 什么是智能仓储?一文带你彻底搞懂!

    来源:机器人网  什么是智能仓储? 智能仓储是仓库自动化的产物. 与智能家居类似,智能仓储可通过多种自动化和互联技术实现.这些技术协同工作以提高仓库的生产率和效率,最大限度地减少人工数量,同时减少错误 ...

  8. 一文带你彻底搞懂C++中一些常见指针(形如*p)的用法

    提高指针效率以及程序可读性 为什么要后置运算符? 有C语言编程经验的人可能会感到疑问,为什么在C++里面我们推荐优先使用运算符的前置版本,就是把运算符号放在变量的前面,前置版本的递增避免了不必要的工作 ...

  9. 一文带你轻松搞懂事务隔离级别(图文详解)

    本文由 SnailClimb 和读者 BugSpeak 共同完成. 事务隔离级别(图文详解) 什么是事务? 事务是逻辑上的一组操作,要么都执行,要么都不执行. 事务最经典也经常被拿出来说例子就是转账了 ...

最新文章

  1. mysql编译参数查看_查看 apache,nginx,mysql 安装时的编译参数
  2. [0] Tornado Todo 开篇
  3. 使用thymeleaf的时候报元素类型“meta“必须由匹配的结束标记
  4. 2021年互联网婚庆行业洞察
  5. python定时爬取数据_python实现scrapy爬虫每天定时抓取数据的示例代码
  6. Python编程实现预剪枝的CART决策树
  7. 我是如何黑掉惠普打印机的
  8. java入门、常量和变量
  9. graphpad两组t检验_如何用 GraphPad prism进行 t 检验?
  10. 人群密度估计最新数据集NWPU-Crowd 最新研究进展
  11. File类,字节字符输入输出流,缓冲流,标准流,对象序列化流
  12. Fiddler安装与配置
  13. Python进行数据分析探索
  14. java毕业设计——基于java+Eclipse+jsp的网上手机销售系统设计与实现(毕业论文+程序源码)——网上手机销售系统
  15. 如何省流量?视频高度压缩背后的预测技术
  16. python特殊方法
  17. 银河麒麟OS C# .netcore桌面应用开发环境搭建笔记
  18. (c语言)单、双精度
  19. Unity 使用IO流读取PNG文本流并加载
  20. 魅族mx3手机 固件升级方法

热门文章

  1. 【黑金原创教程】【FPGA那些事儿-驱动篇I 】实验二十五:SDHC模块
  2. 第9章第9节:完成过渡页幻灯片版式的制作 [PowerPoint精美幻灯片实战教程]
  3. 我的自白--道路与梦想
  4. McNemar test麦克尼马尔检验
  5. qmail于redhat9安装记录(转)
  6. 爱你,是一种流泪的幸福
  7. javascript:加入收藏的代码
  8. 你了解这么多万兆以太网规范吗?
  9. 【深一点学习】BP网络,结合数学推导的代码实现
  10. 免安装chrom浏览器