百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分析 > 正文

C++学习点滴:++i 与i++的区别的挖呀挖

liebian365 2024-11-02 13:33 16 浏览 0 评论

一般初学C++的人,会对‘++i ’与‘i++’的具体区别不加理会的,这也包括本人。但,因最近无意中看到网上的人讲解这个表达式‘i = (i++) + (++i) + ++i’是怎么计算时,可惜他解释得也不清楚,引起本人极大的兴趣,因而本人决定自己对其区别进行挖呀挖式的探秘。现将自己所体会到向大家分享一下。
一.两者的基本性质区别(编译器的处理方式不同)
++i和i++都是表示自增运算,但编译器对它们处理方式是不同的,不同之处在于执行的顺序和返回的结果。对于‘++i’,i的值递增,表达式的值是i的新值,编译器的处理方式是首先将它递增,然后再为表达式赋值;对于‘i++’,i 的值是递增的,但表达式的值是 i 的原始值,编译器的处理方式是首先将它为表达式赋值,然后递增变量i。用代码来理解表达,则为:‘++i’是i += 1,return i;而‘i++’是int temp = i、i += 1,return temp 另外在赋值上虽然它们都可以作为右值但只有++i可以作为左值,例如 ++i = 7,这个语句将把7赋给i,并且将i的值增加1。概述两者的区别如下:
1、i++ 返回原来的值,++i 返回加1后的值;
2、i++前者是先赋值,然后再自增;++i后者是先自增,后赋值;
3、两者可作为右值,i++不能作为左值,而++i可以,如 ++i=7。

二.两者在运算速度上的比较
对于运算速度的比较,
++i只是微级领先两者速度可算是根本上是一样的!(此是网上某些C++大神测试后的表述,因为‘i++’CPU会创建临时变量放在寄存器内,再将临时变量赋给i ,而++i不产生临时变量,因此 ‘++i’在速度上微快些!)下面本人通过在For循环运算中分别使用i++与++i的来比较说明其运算时间和汇编代码的区别,代码如下:
#include<iostream>
#include <stdio.h>
#include <math.h>
#include <windows.h> //LARGE_INTEGER 要使用的头文件
using namespace std;
int main()
{
long sum =0;
LARGE_INTEGER cpuFreq;
LARGE_INTEGER startTime;
LARGE_INTEGER endTime;
double runTime =0.0;
QueryPerformanceFrequency(&cpuFreq);
QueryPerformanceCounter(&startTime);
for(int i=0;i<
20000001;i++) //进行2000万次相加运算
//for(int i=0;i<
20000001;++i)
{
sum =sum+i; }
QueryPerformanceCounter(&endTime);
runTime = (((endTime.QuadPart - startTime.QuadPart) * 1000.0f) / cpuFreq.QuadPart);
cout<<"sum= "<<sum<<endl;
cout<<"此使用i++运算需时:"<<runTime<<"毫秒"<<endl;
//cout<<"此使用++i运算需时:"<<runTime<<"毫秒"<<endl;
system("pause");
return 0;
}
********
运算结果如下图示:(说明:两者的编译状况是一致的)



********
汇编代码比较如下图示:(两者的汇编代码是一样的)



三.着重讲述表达式中出现
多个‘++’的计算方法

当然,对于单条‘++’运算,C++ 小白是很容易理解的,
但对于出现多个++的运算时,其计算可令人惘然,如下面计算式(变量的初始值均设置为0):
i = (i++) + (++i);(
混合运算并给自己赋值
i = (i++) + (++i) + ++i;
i = (i++) + ++i + (i++) + (++i);
b = (i++) + ++i + (i++) + (++i);//
混合运算但给其它变量赋值
i = i++ + ++i + i++ + ++i;//
无括号和混合的运算并给自己赋值
c = ++i + ++i + i++ + ++i ;//
无括号和混合的运算但给其它变量赋值
(i++) + ++i + (++i) + i++;//混合运算但
无给变量赋值
i++ + (++i)+ ++i + (i++);
i = (i++) + (++i) + (++i) + (i++) + (++i);
d = (i++) + (++i) + (++i) + (i++) + (++i);
i = i++ + ++i + ++i + i++ + ++i;/
/无括号和无混合的运算并给自己赋值
i = (i++) + (i++) + (i++) + (i++) + (i++);
i = (++i) + (++i) + (++i) + (++i) + (++i);
j = (i++) + (++i) + (++i) + i++ + (++i)+ i++ + (i++)。
其运算真是让人摸不着头脑的!现先看看
其编程运算的结果如下图示:


程序的代码如下图示:



其反汇编代码为(展示7个运算式的代码图):







通过观摩编译器的汇编代码后,本人领略出编译器在混合和无混合两种情况下的运算机制(方法),现结合以i = (i++) + (++i) + (++i) + (i++) + (++i)的运算式为例,仅讲述在混合情况下的运算机制:
1.编译器对‘
++’运算符的处理等级要优先于‘()’,因此有无括号来括住运算式,其计算结果都是是一样
2.计算时,
先将计算式中的所有前置‘++i’放在前面(左边),将计算式中的所有后置‘i++’放在后面(右边),即先进行对所有的‘++i’操作
3.
再对运算式分别统计出n1个‘++i’(本例有3个)和n2个‘i++’(本例有2个)运算式;
4.然后先将‘++i’运算式中的i值进行n1次(本例3次)加1自增操作,得到结果值为n1(本例为3),并将此值n1赋给i(本例此时i=3);
5.
以此i的值来代入所有计算式(n1+n2个,本例为5个)中进行相加操作,以本例来计算,即(i=3)+(i=3)+(i=3)+(i=3)+(i=3)=15;
6.
再补计算未进行自加1操作的‘i++’的n2个运算式(本例2个),以本例来计算,即增2次加1操作,结果为2,最后将此值与上一步所计算出的结果值(15)相加后所得的最终值(2+15=17)赋给i,此时i的值为17。 (计算完成)
因而i = (i++) + (++i) + (++i) + (i++) + (++i)的运算式则手动计算方法为:
1.先重排序:i =(++i) + (++i) + (++i) + (i++) + (i++) ;
2.对i进行3次自增1计算:i= 0 + 1 + 1 + 1 = 3;
3.将i=3代入整条运算式中(不理会式中“++”符号):3+3+3+3+3 =15;
4.补算2个未进行加1操作“i++”:1+1=2;
5.
再合并计算最终结果值:2+15=17 。(计完)
(无混合情况下的运算机制留给读者自己去琢磨)
四.现再比较‘i++’与 ‘++i’作为For循环中使用的参数的运算区别
看下面一段代码:

cout << "后置++的参数运算" << endl;
for (i = 0; i < 10; i++)
{
cout <<"后置的i的值:" << i << ", "<<endl;
}
cout << endl;
for (i = 0;i < 10; ++i)
{
cout << "前置的i的值:" << i << ", "<<endl;
}
其运行结果图

两者运算的汇编代码如下图示:


两者的运算结果是一样的!查看其反汇编代码后,哦,原来两者的汇编代码是一样的!
(上述测试程序在VS2010和VS2019中测试的结果是一样的)
(完)

相关推荐

4万多吨豪华游轮遇险 竟是因为这个原因……

(观察者网讯)4.7万吨豪华游轮搁浅,竟是因为油量太低?据观察者网此前报道,挪威游轮“维京天空”号上周六(23日)在挪威近海发生引擎故障搁浅。船上载有1300多人,其中28人受伤住院。经过数天的调...

“菜鸟黑客”必用兵器之“渗透测试篇二”

"菜鸟黑客"必用兵器之"渗透测试篇二"上篇文章主要针对伙伴们对"渗透测试"应该如何学习?"渗透测试"的基本流程?本篇文章继续上次的分享,接着介绍一下黑客们常用的渗透测试工具有哪些?以及用实验环境让大家...

科幻春晚丨《震动羽翼说“Hello”》两万年星间飞行,探测器对地球的最终告白

作者|藤井太洋译者|祝力新【编者按】2021年科幻春晚的最后一篇小说,来自大家喜爱的日本科幻作家藤井太洋。小说将视角放在一颗太空探测器上,延续了他一贯的浪漫风格。...

麦子陪你做作业(二):KEGG通路数据库的正确打开姿势

作者:麦子KEGG是通路数据库中最庞大的,涵盖基因组网络信息,主要注释基因的功能和调控关系。当我们选到了合适的候选分子,单变量研究也已做完,接着研究机制的时便可使用到它。你需要了解你的分子目前已有哪些...

知存科技王绍迪:突破存储墙瓶颈,详解存算一体架构优势

智东西(公众号:zhidxcom)编辑|韦世玮智东西6月5日消息,近日,在落幕不久的GTIC2021嵌入式AI创新峰会上,知存科技CEO王绍迪博士以《存算一体AI芯片:AIoT设备的算力新选择》...

每日新闻播报(September 14)_每日新闻播报英文

AnOscarstatuestandscoveredwithplasticduringpreparationsleadinguptothe87thAcademyAward...

香港新巴城巴开放实时到站数据 供科技界研发使用

中新网3月22日电据香港《明报》报道,香港特区政府致力推动智慧城市,鼓励公私营机构开放数据,以便科技界研发使用。香港运输署21日与新巴及城巴(两巴)公司签署谅解备忘录,两巴将于2019年第3季度,开...

5款不容错过的APP: Red Bull Alert,Flipagram,WifiMapper

本周有不少非常出色的app推出,鸵鸟电台做了一个小合集。亮相本周榜单的有WifiMapper's安卓版的app,其中包含了RedBull的一款新型闹钟,还有一款可爱的怪物主题益智游戏。一起来看看我...

Qt动画效果展示_qt显示图片

今天在这篇博文中,主要实践Qt动画,做一个实例来讲解Qt动画使用,其界面如下图所示(由于没有录制为gif动画图片,所以请各位下载查看效果):该程序使用应用程序单窗口,主窗口继承于QMainWindow...

如何从0到1设计实现一门自己的脚本语言

作者:dong...

三年级语文上册 仿写句子 需要的直接下载打印吧

描写秋天的好句好段1.秋天来了,山野变成了美丽的图画。苹果露出红红的脸庞,梨树挂起金黄的灯笼,高粱举起了燃烧的火把。大雁在天空一会儿写“人”字,一会儿写“一”字。2.花园里,菊花争奇斗艳,红的似火,粉...

C++|那些一看就很简洁、优雅、经典的小代码段

目录0等概率随机洗牌:1大小写转换2字符串复制...

二年级上册语文必考句子仿写,家长打印,孩子照着练

二年级上册语文必考句子仿写,家长打印,孩子照着练。具体如下:...

一年级语文上 句子专项练习(可打印)

...

亲自上阵!C++ 大佬深度“剧透”:C++26 将如何在代码生成上对抗 Rust?

...

取消回复欢迎 发表评论: