1

我试图更深入地理解 while 循环。我了解基本知识,即只要测试条件为真,一段时间就会重复该语句。

在 Accelerated C++ 一书中,作者陈述了以下内容:

//the number of blanks surrounds the greeting
const int pad = 1;

//total number of rows to write
const int rows = pad * 2 + 3;

//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
     std::cout << std::endl;

     //incrementing r makes the invariant true again
     ++r;
}

//we can conclude that the invariant is true here

我不明白,为什么写一行输出不变量为假,然后在增量处再次为真。这本书的作者有没有搞错?

编辑 - 该变体只是一种智能工具,可以更轻松地理解 while 循环。在此示例中,变体是“r = 输出中的行数”。

------------什么是不变量---------------

什么是不变量?

4

3 回答 3

2

作者没有记错

他可能只是忘了提及不变量是什么。

不变 != 循环条件。

不变量(在您的情况下很可能是“程序已打印 r 行”)是正式谈论代码正确性时考虑的条件(通常仅在某处作为注释给出);它循环条件不同(在您的情况下为“r!= rows”!

于 2013-10-15T10:26:57.460 回答
2

本质上,您在评论中回答了自己的问题:

他们只说“写一行输出会导致不变量变为假,因为 r 不再是我们写的行数。但是,增加 r 以说明所写的行将使不变量再次为真。”

概括:

  • 不变量是“r = 写入输出的行数”
  • 打印一个空行会使这个不变量无效(因为 r 没有改变,但是写入输出的行数增加了 1)
  • r 加一后,不变量再次为真
于 2013-10-15T11:56:51.253 回答
0

作者所说的不变量是什么?(我确定它在某处有所说明。)从评论中,我猜它是这样的:. 因此,当您输出一行(行)时,这将变为错误,直到您更新以反映您刚刚输出的行。r == number of rows outputr

当然,还有其他不变量:r != rows例如 that 。在这种情况下,输出不会使不变量无效,而是使++r可能无效。当然,++rin循环后面没有代码,所以没关系,很多人会写这个循环:

for ( int r = 0; r != rows; ++ r ) {
    std::cout << std::endl;
}

这样第二个不变量就不会在“循环内”被违反。

于 2013-10-15T11:39:15.790 回答