毕竟,我们通常必须说明函数返回的内容;也就是说,如果我们从函数返回一个值,我们总是对返回值做出承诺(调用者还会怎样期待)。
int area(int lenght, int width)
// pre-conditions : lenght and width are positive
// post-condition : returns a positive value that is the area
{
if (lenght <= 0 || width <= 0) error("area() pre-condition");
int a = lenght * width;
if (a <= 0) error("area() post-condition");
return a;
}
这是一个使用前置条件和后置条件的简单示例,但我无法理解的是作者在展示示例后所说的内容:
&#34;我们无法检查完整的后置条件,但我们检查了那些说应该是正面的部分&#34;。
这是什么意思?为什么我们无法检查完整的后置条件?根据我在这种情况下作为后置条件的理解我们只需要检查变量a是否为正,我错了吗?
比作者问我这个问题:
找到一对值,以便此版本区域的前提条件成立,但后置条件不会。
这不是不可能的吗?
答案 0 :(得分:3)
在我的理解中,作为后置条件,我们只需要检查变量a是否为正,我错了吗?
是。请注意完整的后置条件......
返回正值即区域
可以传递length
和width
的值,使a
因溢出而无法出现在正确的区域。
答案 1 :(得分:2)
为什么我们无法检查完整的后置条件?
因为后置条件的一部分是&#34;那是区域&#34;。我们还没有检查过;并且检查乘法的结果是否等于数学期望值是不容易的。
这不是不可能的吗?
如果乘法溢出,给出未定义的行为,则可能会从两个正输入中得到否定结果。
答案 2 :(得分:0)
你的例子肯定是lenght * width
中签名的算术溢出。
在这种情况下,这是对后置条件概念的非常糟糕的说明。应该描述解释前提条件的期望是:
你问题中的例子说明了第一点,而不是第二点。
作者认为该函数为某些输入返回负“区域”,但作者错误:该函数只能返回正确的结果(正值是正确的区域)或调用未定义的行为。这种未定义的行为可能会导致a
在某些编译平台上显示为负数,这是无关紧要的。未定义的行为是被禁止的。未定义的行为是不可预测的。