在阅读加速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不再是我们写入的行数
鉴于定义,我无法在两者之间形成联系。
为什么在输出一行输出时,不变量会变为假?
答案 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
会使不变量再次变为真。