什么是不variables?

这个词似乎在许多情况下被使用。 我能想到的最好的是他们的意思是一个不能改变的variables。 难道不是什么常量/决赛(难道你是Java!)?

不variables比variables更“概念化”。 一般来说,这是程序状态的一个属性,总是正确的。 保证不variables的函数或方法被认为是保持不变的。

例如,二叉search树可能具有不变性,即对于每个节点,节点的左子节点的密钥小于节点自己的密钥。 一个正确的插入函数为这棵树将保持不变。

正如你所看到的那样,这不是你可以存储在一个variables中的东西:它更像是一个关于程序的声明。 通过计算你的程序应该维护什么types的不variables,然后检查你的代码以确保它实际上保持了这些不variables,你可以避免代码中的逻辑错误。

这是一个你知道在你的逻辑的某个特定位置总是成立的条件,并且可以在debugging的时候检查出什么地方出了问题。

我通常从algorithm或结构的angular度来看待它们。

例如,你可以有一个可以被断言的循环不变式 – 在每次迭代的开始或结束时总是为真。 也就是说,如果您的循环应该处理从一个堆栈到另一个堆栈的对象的集合,您可以在循环的顶部或底部说| stack1 | + | stack2 | = c。

如果不变检查失败,则表明出现了问题。 在这个例子中,这可能意味着你忘了把处理过的元素推到最后的堆栈等等。

维基百科的魔力: 不变(计算机科学)

在计算机科学中,一个谓词,如果是真的,在整个特定的操作序列中将保持为真,则被称为(an)该序列不变的。

在代码块中不变的东西

继续之前,不variables在编写干净的代码时非常有用,因为从概念上了解应该代码中出现哪些不variables这使得您可以轻松地决定如何组织代码以实现这些目标。 就像ealier提到的那样,它们在debugging时也很有用,比如检查是否维护不变是一个很好的方法,看看你正在执行的任何操作实际上正在做你想做的事情。

ADT不variables指定数据字段(实例variables)之间的关系,在执行任何实例方法之前和之后必须始终为true。

正如这行指出:

在计算机科学中,一个谓词,如果是真的,在整个特定的操作序列中保持为真,则被称为(an)对于该序列是不变的。

为了更好地理解这个希望这个例子在C ++中有所帮助。

考虑一个场景,你必须得到一些值,并获得一个名为count的variables的count ,并将它们添加到名为sum的variables中

不variables (再次更像是一个概念):

 // invariant: // we have read count grades so far, and // sum is the sum of the first count grades 

上面的代码就是这样的,

 int count=0; double sum=0,x=0; while (cin >> x) { ++count; sum+=x; } 

上面的代码是做什么的?

1)从cin读取input并将其放入x

2)一次读取成功后,递增countsum = sum + x

3)重复1-2,直到读取停止(即ctrl + D)

循环不变:

不变必须是真的总是 。 所以最初你只是用这个开始你的代码

 while(cin>>x){ } 

这个循环从标准input读取数据并存储在x中。 好,好。 但是不variables变成了虚假的,因为我们的不variables的第一部分没有被遵循(或被保留)。

 // we have read count grades so far, and 

如何保持不变的真实?

简单! 增量计数。

所以++count; 会做得很好! 现在我们的代码变成了这样的东西,

 while(cin>>x){ ++count; } 

即使现在我们的不variables (一个必须为TRUE的概念)也是假的,因为现在我们不满足我们不variables的第二部分。

 // sum is the sum of the first count grades 

那现在该怎么办?

添加x进行sum并将其存储在sumsum+=x )中,下一次cin>>x将读入一个新的值到x中。

现在我们的代码变成了这样的东西,

 while(cin>>x){ ++count; sum+=x; } 

让我们检查

代码是否匹配我们的不variables

 // invariant: // we have read count grades so far, and // sum is the sum of the first count grades 

码:

 while(cin>>x){ ++count; sum+=x; } 

啊!。 现在循环不变总是为真,代码工作正常。

上面的例子是由Andrew-koening和Barbara-E编写的“ Accelerated C ++ ”一书的