2013-03-07 79 views
1

我有兩個片段:這兩個while循環等價嗎?

while (indent-- > 0) 
    { 
    out << " "; 
    } 
while (indent > 0) 
    { 
    indent -= 1; 
    out << " "; 
    } 

據我所看到的,沒有任何不確定的行爲在第一個片段回事(見here)。

我的問題是:這兩個片段是否相等?

我不太確定,因爲-=運算符的優先級高於比較運算符,因此應該先在第一個片段中執行。然而,第二個片段僅在比較後才執行此操作。

+0

優先級在兩個片段中都是不相關的。具有多個運算符的唯一語句是'indent-> 0',並且沒有矛盾。 '(indent--)> 0'是解析它的唯一方法,'indent--(> 0)'或'indent( - > 0)'是無效的。 – 2013-03-12 08:47:21

回答

5

他們將運行循環的主體相同的次數,但它們不一樣。

第一個將遞減indent一個額外的時間,在離開-1indent,因爲--運營商將運行條件是否成功或失敗。

第二個將使indent0。這是一個完整的工作示例:

#include <iostream> 

int main() 
{ 
    int indent = 3; 
    while (indent-- > 0) 
    { 
     std::cout << "First "; // Prints three times 
    } 

    std::cout << indent << std::endl; // Prints -1 

    indent = 3; 
    while (indent > 0) 
    { 
     indent -= 1; 
     std::cout << "Second "; // Prints three times 
    } 

    std::cout << indent << std::endl; // Prints 0 
} 

// Output: 
// First First First -1 
// Second Second Second 0 
+1

還有一個區別(假設'indent'是一個有符號的整型):如果在進入循環之前'indent'具有值「INT_MIN」(或者與該類型相對應的最小值),那麼第一個片段具有未定義的行爲。 – 2013-03-07 09:59:26

4

這兩者之間沒有區別,因爲indent--是後增量 - 它將返回之前的值indent - 儘管如此,while (--indent > 0)也會有所不同。

因此,對於基本類型,它們是等價的。

由於這是C++,不過,你可以和定義自己的類,有indent該類型的對象,超載--=(int)>,並讓他們的行爲完全不同的(我希望這是情況並非如此)。

編輯:正確,indent的值是不一樣的。

+0

不,這是我正在審查/記錄的一些舊代碼的一部分:P 我只是想讓它更明顯代碼實際上在做什麼 – 2013-03-07 09:41:51

+1

你早一秒..刪除了我的答案..但請閱讀Pihhan's回答,兩個代碼之間存在差異。 – Krishnabhadra 2013-03-07 09:42:56

+0

但是,循環後的'indent'的值對於這兩個片段是不同的。 – 2013-03-07 09:50:41

3

我認爲他們是不同的。缺少的是縮進的初始化及其類型。

第一次循環在比較後總是遞減,第二次只在條件爲真時遞減。如果(indent> 0)在循環之前爲真,則它們的行爲方式完全相同。如果indent == 0,則第一個循環將使其-1而不打印一次。其次不會打印任何縮進,但也不會減少縮進。

所以,它們在某些情況下是不同的。

+3

該聲明不正確:「如果(indent> 0)在循環之前爲真,則它們的行爲方式完全相同。「第一個片段總是會比第二個片段多一次減少'indent' – 2013-03-07 09:48:29

+0

你說得對,它們在任何情況下都不相同 – Pihhan 2013-03-07 09:55:23