为什么这个不变量变得虚假?

时间:2012-06-01 22:48:28

标签: c++ invariants

在阅读加速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

然后解释......

  

写一行输出会导致不变量变为false,因为r不再是我们写入的行数

鉴于定义,我无法在两者之间形成联系。

为什么在输出一行输出时,不变量会变为假?

2 个答案:

答案 0 :(得分:3)

r被定义为已打印的行数。因此,只有当

时,不变量才为真
r == number of rows that have been printed

在您打印行和增加r以更新到目前为止打印的行数之间,该不变量不正确。

r等于某个数字(例如n),并且“已打印的行数”比该数字(n + 1)大1,因为你刚刚打印的那一行。因此,不变量不是真的,因为n != n + 1

答案 1 :(得分:0)

  

到目前为止我们已经编写了r行输出

r从0开始,并且在cout为r的点仍为0. cout已写入1行,但r为0.因此, invariant是临时错误的,因为如果你将r的值插入上面的语句中,那么“我们到目前为止已经写出了0行输出”是不正确的。

递增r会使不变量再次变为真。