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 不再是我们写的行数

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

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

4

2 回答 2

3

r定义为已打印的行数。因此,不变量只有在

r == number of rows that have been printed

在打印一行和递增r以更新到目前为止打印的行数之间,该不变量不成立。

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

于 2012-06-01T22:52:19.040 回答
0

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

r从 0 开始,并且在coutr 仍然为 0的点。cout写了 1 行但r为 0。因此不变量暂时为假,因为如果将 的值r插入到上面的语句中,则“我们到目前为止已写出 0 行输出”。

递增r导致不变量再次变为真。

于 2012-06-01T22:52:28.007 回答