C ++中的前置条件和后置条件

时间:2015-02-09 18:07:44

标签: c++ error-handling

毕竟,我们通常必须说明函数返回的内容;也就是说,如果我们从函数返回一个值,我们总是对返回值做出承诺(调用者还会怎样期待)。

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是否为正,我错了吗?

比作者问我这个问题:

  

找到一对值,以便此版本区域的前提条件成立,但后置条件不会。

这不是不可能的吗?

3 个答案:

答案 0 :(得分:3)

  

在我的理解中,作为后置条件,我们只需要检查变量a是否为正,我错了吗?

是。请注意完整的后置条件......

  

返回正值即区域

可以传递lengthwidth的值,使a因溢出而无法出现在正确的区域。

答案 1 :(得分:2)

  

为什么我们无法检查完整的后置条件?

因为后置条件的一部分是&#34;那是区域&#34;。我们还没有检查过;并且检查乘法的结果是否等于数学期望值是不容易的。

  

这不是不可能的吗?

如果乘法溢出,给出未定义的行为,则可能会从两个正输入中得到否定结果。

答案 2 :(得分:0)

你的例子肯定是lenght * width中签名的算术溢出。

在这种情况下,这是对后置条件概念的非常糟糕的说明。应该描述解释前提条件的期望是:

  • 如果使用满足前置条件的参数调用函数,则它不会调用未定义的行为。
  • 如果使用满足前置条件的参数调用函数,则函数终止时后置条件成立。

你问题中的例子说明了第一点,而不是第二点。

作者认为该函数为某些输入返回负“区域”,但作者错误:该函数只能返回正确的结果(正值是正确的区域)或调用未定义的行为。这种未定义的行为可能会导致a在某些编译平台上显示为负数,这是无关紧要的。未定义的行为是被禁止的。未定义的行为是不可预测的。