2015-02-08 44 views
6

當我編譯並運行代碼counter++++counter代替x時,輸出是相同的;在這兩種情況下,數字1 - 10:在for循環中,根據迭代的總數量,前/後遞增循環控制變量是否有區別?

for (int counter = 1; counter < 11; x) 
{ 
    std::cout << counter << endl; 
} 

原本我以爲++counter會加1,然後返回前新值在環頭布爾表達式進行了評價。即當從counter = 1開始並使用++counter時,counter在布爾表達式中將具有值2。這似乎不是這種情況,因爲兩個輸出都是相同的,而不是像我預期的那樣迭代次數少一點的++counter版本。

四處閱讀,它看起來++countercounter++分別增加counter 1循環體的開始或結束。在這種情況下,至少在概念上,這不是一個相同的行爲?因爲循環結束和循環的開始在循環經過第一次迭代時是相同的。

我唯一能看到這個有所作爲的時間是在第一次迭代中,如果使用counter++(因爲在循環結束處將1添加到計數器中),std::cout << counter << endl;應該將1輸出到控制檯。如果使用++counter(因爲在循環開始時計數器加1),std::cout << counter << endl;應該輸出2給控制檯。

除了上面的問題,您能否精確地解釋在for循環頭文件中評估三個動作的順序,並且在使用i++++i時準確解釋迭代發生的位置。

非常感謝!

+0

簡而言之:沒有,沒有對迭代次數任何區別。 – 2015-02-08 10:12:17

+0

請參閱[** for loop **](http://en.cppreference.com/w/cpp/language/for)。 – juanchopanza 2015-02-08 10:15:08

+0

在循環的那個地方,它們是等效的。另外請注意,編譯器幾乎可以肯定地在後續增量中交換該地點的預增量,至少在啓用優化時。 – stj 2015-02-08 15:41:14

回答

15

沒有區別。在較早的編譯器中,++counter的速度更快,因爲它沒有創建臨時變量,但所有現代編譯器都可以優化這一點。對於使用定製(非內聯)增量運算符的重物,++counter仍然可以更高效。

至於何時評估發生:

for (initialization; condition; increment/decrement) 
    code; 

被評價爲

{ 
    initialization; 
    while (condition) 
    { 
     code; 
     increment/decrement; 
    } 
} 
+0

你可以在這裏找到更多的例子:http://en.cppreference.com/w/cpp/language/for – MAC 2015-02-08 10:19:26

+0

@StenSoft歡呼的幫助! – 2015-02-08 10:26:11

+0

提及在devug構建中,'++'pre將會更快一些:而且非常緩慢的調試buikds可能會令人討厭。 – Yakk 2015-02-08 13:21:54

5

的C++ for循環可以是大致視爲用於以下(使用例)語法糖:

int counter = 1; 
while (counter < 11) 
{ 
    std::cout << counter << endl; 
    x; 
} 

因此,初始化s首先執行語句,在每次迭代之前執行條件表達式,並且在每次迭代結束時執行增量語句。

我們可以在這裏看到,使用後增量或預增加運算符對循環邏輯沒有影響,儘管可能存在其他差異(後增量實際上需要保留變量的舊值的副本,因爲是表達式的值,其具有一些相關成本,參見Preincrement faster than postincrement in C++ - true? If yes, why is it?)。

+0

看起來像一個無限循環給我。 – juanchopanza 2015-02-08 11:49:19

+1

x在這裏將被++計數器或計數器++取代。我遵循海報建議的慣例。 – 2015-02-08 15:14:47