2013-08-19 55 views
7

this的啓發。玩弄參數

假設我們有一個非空std::vector<T> v; 是有

for (int i = v.size() - 1; i >= 0; i--) { 
///Stuff. 
} 

之間的任何差別:

for (int i = v.size(); i--;) { 
///Stuff. 
} 

我的意思是,我不會做,對於可讀性的緣故,但誰知道,這可能是在生活中有用的...

Here只是一個測試,看看它們是等價的)

編輯:的點被具有i作爲索引向後訪問向量(在具有索引爲優選具有迭代器的情況下)

編輯2:出於好奇:他們最終具有略有不同的彙編代碼。見thisthis

+0

1)基準它看到沒有區別。2)比較生成的程序集並驗證沒有什麼實質性差異。 –

+1

@JonathonReinhart因爲在循環條目之前檢查條件,所以不需要刪除'-1'。 – dasblinkenlight

+0

你知道你可以使用reverse_iterators來做這件事嗎? –

回答

2

這是一種合法的方式,但在可讀性方面使用i--作爲for循環中的條件是一個糟糕的主意。

for循環意味着由3部分組成 - 爲什麼讓人們生活更難?

人誰看了你的代碼會很高興,如果你堅持傳統for循環:

for (int i = v.size() - 1; i >= 0; i--) { 
    ///Stuff. 
} 
4

人們可以把一個for循環

for (<decl-init> ; <condition> ; <post-adjust>) <body> 

作爲大致相當於這個while循環:

<decl-init>; 
while (condition) { 
    <body>; 
    <post-adjust>; 
} 

The for與上面重寫的最大區別在於<decl-init>塊中聲明的變量範圍,但這對於下面的分析並不重要。

重寫兩個循環的循環while給你這樣的:

int i = v.size() - 1; 
while (i >= 0) { 
    <body>; 
    i--; 
} 

int i = v.size(); 
while (i--) { 
    <body>; 
} 

正如你所看到的,唯一的區別是i在進入迭代之前遞減,並該條件開始於i比第一個循環大1。這兩個調整「相互抵消」,從技術角度來看,您的循環等同。然而,美學是一個不同的事情:副作用的條件比「純」的條件更難理解,所以第一個循環更具可讀性。