2012-06-01 61 views
2

在閱讀加速C++我被爲什麼不變變爲假給出的解釋混淆(見下面的代碼):爲什麼這個不變量變成錯誤?

不變量由作者定義(在這種情況下)爲:

的對於我們來說不變的是,我們已經寫出了r行輸出到目前爲止。當我們定義r時,我們給它一個初始值爲0.在這一點上,我們沒有寫任何東西。將r設置爲0顯然使得不變爲真,所以我們已經滿足了第一個要求。

// invariant: we have written r rows so far 
int r = 0; 

// setting r to 0 makes the invariant true 
while (r != rows) { 
    // we can assume that the invariant is true here 

    // writing a row of output makes the invariant false <- WHY? 
    std::cout << std::endl; 

    // incrementing r makes the invariant true again 
    ++r; 
} 
// we can conclude that the invariant is true here 

再後來解釋...

寫輸出的行會導致不變,成爲假的,因爲r是不再我們寫

行數

鑑於定義我不能形成兩者之間的聯繫。

爲什麼當一行輸出寫入時,不變量會變成false?

+3

我可能會錯過一些東西,但是'endl'放了一個換行符,所以你現在寫了一行輸出並且已經移到了第二行。增加'r'會使數字從0增加到1.在打印後你增加'r',它會保存你寫入0行的數據,但實際上你寫了1個。 – chris

回答

3

r定義爲已打印的行數。因此,不變的是真實的,只有當

r == number of rows that have been printed 

當您打印一行,當你增加r更新到目前爲止打印的行數,即不變的是不正確的關係。

r等於一定數量(比如,n),以及「已打印行數」大於號(n + 1)較大的一個,因爲該行的你只是打印。因此,不變量是不正確的,因爲n != n + 1

+0

我猜是什麼樣的例子正在試圖指出的是,在像c這樣的程序語言(以及大多數其他語言)中,您需要意識到執行是分階段進行的,思考每一步可能很重要,並且需要考慮整體代碼塊。請記住,即使在一行代碼中,許多單獨的步驟可能正在發生。有時,理解一個行爲取決於理解這種時間關係,從一個稍高的角度來看,「永遠是真實的」事實上並不總是如此,當你看細節。 – derekv

0

我們寫r行輸出的迄今

r開始爲0,並在其中cout爲r的點仍然0。cout寫1行,但r是0。因此,不變量是暫時的錯誤,因爲如果在上面的語句中插入r的值,那麼「我們已經寫出0行輸出到目前爲止」是不真實的。

遞增r導致不變量再次變爲真。