1. 程式人生 > >C++ 變數“前++”與“後++”的區別

C++ 變數“前++”與“後++”的區別

問題描述

我們在使用迴圈遍歷容器時,經常會看到一個自增/自減的表示式,比如: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