首页IT科技for循环里i++和++i的区别(for循环中i++与++i的效率探究 zy1691的专栏 博客频道 CSDN.NET)

for循环里i++和++i的区别(for循环中i++与++i的效率探究 zy1691的专栏 博客频道 CSDN.NET)

时间2025-08-04 16:34:56分类IT科技浏览7605
导读:2009-11-21 23:50 1279人阅读...

2009-11-21 23:50 1279人阅读 评论(0) 收藏 举报

for(int i=0;i<=50;i++)

我们经常会使用这样的代码来做循环              ,一般在for循环中习惯于使用i++                      ,却很少使用++i              。虽然从代码执行的效果来看        ,它们并无任何区别           ,但是它们所生成的代码是有有所不同的                      。

i++ :先引用后增加

++i :先增加后引用

意思就是说就是

i++ :先在i所在的表达式中使用i的当前值                     ,后让i加1

++i :让i先加1            ,然后在i所在的表达式中使用i的新值

i++由于是在使用当前值之后再+1        ,所以会需要一个临时变量来转储                     ,而++则直接+1                ,不存在这样的问题        。

这样考虑的话就会得出使用++i要优于i++的结论    ,是否真的如此?

还是让代码来说明一切吧           。

试验使用如下代码:

int c=0;

for(int i=0;i<=50;i++)

c=c+i;

std::cout<<c;

首先在debug下编译:

i++情况

; 9 : int c;

; 10 : for(int i=0;i<=50;i++)

movDWORD PTR _i$20035[ebp], 0

jmpSHORT $LN3@wmain

$LN2@wmain:

moveax, DWORD PTR _i$20035[ebp]

addeax, 1

movDWORD PTR _i$20035[ebp], eax

$LN3@wmain:

cmpDWORD PTR _i$20035[ebp], 50; 00000032H

jgSHORT $LN1@wmain

; 11 : c=c+i;

cmpBYTE PTR $T25811[ebp], 0

jneSHORT $LN6@wmain

pushOFFSET $LN7@wmain

call__RTC_UninitUse

addesp, 4

++i情况

; 9 : int c;

; 10 : for(int i=0;i<=50;++i)

movDWORD PTR _i$20035[ebp], 0

jmpSHORT $LN3@wmain

$LN2@wmain:

moveax, DWORD PTR _i$20035[ebp]

addeax, 1

movDWORD PTR _i$20035[ebp], eax

$LN3@wmain:

cmpDWORD PTR _i$20035[ebp], 50; 00000032H

jgSHORT $LN1@wmain

; 11 : c=c+i;

cmpBYTE PTR $T25811[ebp], 0

jneSHORT $LN6@wmain

pushOFFSET $LN7@wmain

call__RTC_UninitUse

addesp, 4

$LN6@wmain:

moveax, DWORD PTR _c$[ebp]

addeax, DWORD PTR _i$20035[ebp]

movBYTE PTR $T25811[ebp], 1

movDWORD PTR _c$[ebp], eax

jmpSHORT $LN2@wmain

$LN1@wmain:

可以看出++i确实省去了对内存操作的环节                     ,直接addeax, 1                    ,用++i真的能提高性能                     。

当然,上面是用debug版本                 ,也就是说没有优化                       ,那么在release优化的情况下会怎样呢            。

继续试验

i++优化

; 9 : int c;

; 10 : for(int i=0;i<=50;i++)

movecx, DWORD PTR _c$[esp+4]

xoreax, eax

$LL3@wmain:

; 11 : c=c+i;

addecx, eax

inceax

cmpeax, 50; 00000032H

jleSHORT $LL3@wmain

++i优化

; 9 : int c;

; 10 : for(int i=0;i<=50;++i)

movecx, DWORD PTR _c$[esp+4]

xoreax, eax

$LL3@wmain:

; 11 : c=c+i;

addecx, eax

inceax

cmpeax, 50; 00000032H

jleSHORT $LL3@wmain

结论:在没有编译器优化的情况下    ,++i更好        。优化过后两者都一样              ,看起来似乎喜欢怎样写都无所谓了                     。

但是如果这里的i不是int而是迭代器                      ,那么++在前和在后就会有所不同        ,使用++i将会有切实的更高的效率                。虽然int情况下没多少区别           ,但为了语法上的统一                     ,最好一律改用++i这种形式    。

所以            ,建议在这种地方一律改用++i的形式                     。

声明:本站所有文章        ,如无特殊说明或标注                     ,均为本站原创发布                    。任何个人或组织                ,在未征得本站同意时    ,禁止复制                、盗用                      、采集      、发布本站内容到任何网站            、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益                     ,可联系我们进行处理                 。

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
starry几岁(Ringo) win11正式版更新内容(最新!Windows 11 更新将整合 AI 技术)