「实用」让你彻底搞定i++与++i的区别

news/2024/10/7 18:24:30

i++与++i单独用时的效果是一模一样的,但是如果突然要你说他们俩的区别,你又能不能回答上来呢?这篇博文,我们就完全弄懂他们俩兄弟的区别!

基本概念

i++和++i要是单独使用的话效果是一样的,都是i=i+1,实验证明:
i++ 代码:

#include<bits/stdc++.h>
using namespace std;
int main(){int i = 0;i++;cout << i;return 0;
}

i++ 运行结果:

1

++i 代码:

#include<bits/stdc++.h>
using namespace std;
int main(){int i = 0;++i;cout << i;return 0;
}

++i 运行结果:

1

区别

方法1:测试

我们假设一个变量是a,那么a=i++与a=++i的运行结果就不太一样了,我们分别说明
i++:
i++其实就是先干活后吃饭,这里的干活就是指被赋值到变量a的上面,吃饭就是自增1
++i:
++i和i++相反,即先吃饭后干活,先执行的是i=i+1,再被赋值到变量a中
这里给大家准备了一个比较好理解的图片:

我们依然以一个实验来证明:

代码:

#include<bits/stdc++.h>
using namespace std;
int main(){int i = 3;cout << "This is i++:\n";int a1 = i++;cout << "i:" << i << " a:" << a1 << "\n";cout << "This is ++i:\n";i = 3;int a2 = ++i;cout << "i:" << i << " a:" << a2 << "\n";  return 0;
} 

运行结果:

This is i++:
i:4 a:3
This is ++i:
i:4 a:4

方法2:看汇编代码

汇编代码这里就不给大家截图了,大家可以自己去试一试

i++先是3次mov(移动),然后才add(增加),最后再来一次mov,而++i先1次mov,接着直接自增,最后再3次mov

效率

之前我做过一个实验,也就是看控制台下方的时间,结果就是++i比i++要稍快一些,但是这两段代码的区别不大,要是极度追求效率,推荐++i

那么这是为什么呢?

回到他们俩之间的区别,a = i++时a为3,其实这个3在一些人的理解中并不是原先的i,而是i++时生成的一个临时变量,这个临时变量的生成拖延了i++的时间,而++i就是直接干脆利落的i+=1,并没有其他什么麻烦的操作

这个结论在基本编程中没有太多应用,但是在自定义类型中,应该尽量使用快一点的++i

最后,如果这篇博客对你有帮助,请您帮我点个推荐,谢谢!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/28225.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

【GD32】---- 移植工程模板

移植GD32E230的官方库文件,并创建一个工程模板1 新建模板文件夹 新建一个名叫03_GD32TemplateProject的文件夹,用于建造工程模板2 移植官方库文件 在模板文件夹里新建5个文件夹,分别存放官方库文件和系统驱动文件01_main 存放main函数02_Startup 存放系统启动文件03_System …

P9527 [JOISC2022] 洒水器 题解

P9527 [JOISC2022] 洒水器 题解。题目传送门 以下设 \(\operatorname{dis}(x,y)\) 表示树上 \(x,y\) 两点间的距离。修改时对 \(u\) 的周围与 \(u\) 距离小于等于 \(d\) 的点的点权乘 \(w\)。暴力不行,于是考虑打标记。 注意到 \(0\le d\le 40\),一个很自然的想法是:设 \(ta…

OpenStack-容器手册(全)

OpenStack 容器手册(全)原文:zh.annas-archive.org/md5/D8A2C6F8428362E7663D33F30363BDEB 译者:飞龙 协议:CC BY-NC-SA 4.0前言 容器是近年来最受关注的技术之一。随着它们改变了我们开发、部署和运行软件应用程序的方式,它们变得越来越受欢迎。OpenStack 因被全球许多组…

MySQL夺命16问,你能坚持到第几问(转)

原文:https://zhuanlan.zhihu.com/p/534415409 1、数据库三大范式是什么?** 第一范式:每个列都不可以再拆分。 第二范式:在第一范式的基础上,非主键列完全依赖于主键,而不能是依赖于主键的一部分。 第三范式:在第二范式的基础上,非主键列只依赖于主键,不依赖于其他非主…

Docker-DevOps-入门手册(全)

Docker DevOps 入门手册(全)原文:zh.annas-archive.org/md5/A074DB026A63DFD63D361454222593A5 译者:飞龙 协议:CC BY-NC-SA 4.0前言 Docker 与 DevOps 概述了容器化的强大力量以及这种创新对开发团队和一般运营的影响。我们还将了解 DevOps 的真正含义,涉及的原则,以及…

07. C语言程序执行流程控制

【有条件执行语句】 if esle 语句 if else 语句根据一个条件确定是否执行一段代码,执行条件是一个布尔值,布尔值为true则执行,为false则不执行,同时可以设置不符合条件时执行的语句。 if(执行条件) {符合条件时执行的代码; } else {不符合条件时执行的代码; } 使用事项:1.…

用蒙特卡罗方法求积分

实验任务 采用 Monte-Carlo 法计算函数 y=x2 在 0~10 之间的积分值 实验目的 熟悉 MPI_Reduce() 函数的用法 实验方法 该算法的思想是通过随机数把函数划分成小的矩形块,通过求矩形块的面积和来求积分值,我们生成 n 个 0~10 之间的随机数,求出该随机数所对应的函数值作为矩…