C++ 变量“前++”与“后++”的区别

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_27278957/article/details/82976936

问题描述

我们在使用循环遍历容器时,经常会看到一个自增/自减的表达式,比如:i++、++i、--i、++i。我们在书本上比较常见的就是++i,那么到底 i++ 与 ++i有什么区别呢?

区别1

书本上解释的表达式方式区别:i++是先取变量i,再将变量i值+1;而++i是先将变量i值+1,再取变量i。在循环遍历容器变量时,这两种方式的结果都是一样的,但是,本质的效率上有很大的区别,下面介绍另一种效率区别。

区别2

我们使用STL(标准模板库)中的一个例子来解释。STL中的遍历可以是以下两种之一:

for(iterator it =begin(); it != end(); ++it)

或者

for(iterator it = begin(); it != end(); it++)

两者的区别是什么呢?并且

for(iterator it = begin(); it != end(); ++it)
{ 
    return it->second;
}
for(iterator it = begin(); it != end(); it++)
{
       return it->second;
}

两者每一次返回的结果是否相同?

两种方式iterator遍历的次数是相同的,但在STL中效率不同,前++返回引用,后++返回一个临时对象,因为iterator是类模板,使用 it++这种形式要返回一个无用的临时对象,而it++是函数重载,所以编译器无法对其进行优化,所以每遍历一个元素,你就创建并销毁了一个无用的临时对象。C++的标准库,还有符合标准C++的教材,除了特殊需要和对内置类型外,基本都是使用++it来进行元素遍历的,不管是源代码还是教材中都是如此。

用户定义类型对操作符的重载应与内置操作符的行为相似,而且后自增/减往往是引用前自增/减来作为其实行的一个副本。

下面是标准库源码:

标准库源码截图

总结

C++ 变量“前++”与“后++” 共有以上两种区别,现在再使用++时应该就明白为什么需要使用前++了吧。

参考 

本文一部分参考其他博主的文章,原文链接:https://blog.csdn.net/yangxuan0261/article/details/50414855

猜你喜欢

转载自blog.csdn.net/qq_27278957/article/details/82976936