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

Pre-conditions and post-condition in C++

本文关键字:条件 前置条件 C++      更新时间:2023-10-16

毕竟,我们通常必须声明函数返回的内容;也就是说,如果我们从函数中返回一个值,我们总是对返回值做出承诺(否则调用方会期望什么)。

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; 
}

这是一个使用前置条件和后置条件的简单例子,但我不能理解的是作者在展示这个例子后说的话:

"我们无法检查完整的后期状况,但我们检查了说应该是阳性的部分"。

这是什么意思?为什么我们不能检查完整的张贴条件?在我的理解中,在这种情况下,作为后置条件,我们只需要检查变量a是否为正,我错了吗?

比作者问我这个问题:

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

这不是不可能吗??

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

是的。请注意完整的张贴条件。。。

返回一个正值,即区域

可以传递lengthwidth的值,使得a由于溢出而不能到达正确的区域。

为什么我们不能检查完整的张贴条件?

因为后置条件的一部分是"那就是区域"。我们还没有检查;检查乘法的结果是否等于数学上的期望值并不是一件小事。

这不是不可能吗??

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

您的示例肯定是关于lenght * width中的有符号算术溢出的。

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

  • 如果用满足前置条件的参数调用函数,则它不会调用未定义的行为
  • 如果用满足前置条件的参数调用函数,那么当函数终止时,后置条件将保持

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

作者认为函数为某些输入返回了一个负的"区域",但作者错了:函数只能返回正确的结果(一个正值,即正确的区域)或调用未定义的行为。这种未定义的行为可能导致a在某些编译平台上出现负值,这是无关紧要的。禁止未定义的行为。未定义的行为是不可预测的。

int rectangle_area(int length, int width)
{
    // Pre-condition check
    if (length <= 0 || width <= 0)
        perror("area() pre-condition violated: length and width must be positive");
    int a = length * width;
    // Post-condition check
    if (a <= 0)
        perror("area() post-condition violated: the calculated area is not positive");
    return a;
}
int main()
{
    int length = -5;
    int width  = -5;
    int result = rectangle_area(length, width);
    cout << result << "n";
    return 0;
}