C++中的前置条件和后置条件
Pre-conditions and post-condition in C++
毕竟,我们通常必须声明函数返回的内容;也就是说,如果我们从函数中返回一个值,我们总是对返回值做出承诺(否则调用方会期望什么)。
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是否为正,我错了吗?
是的。请注意完整的张贴条件。。。
返回一个正值,即区域
可以传递length
和width
的值,使得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;
}
相关文章:
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 在没有太多条件句的情况下,我如何避免被零除
- 基于多个条件处理地图中的所有元素
- 条件constexpr函数
- 无论条件是否为true,if总是在c++中执行
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 基于模板值的条件变量
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- 将按位if条件转换为普通if条件
- 条件断点在不应该触发时触发
- 为什么简单的算术减法在"if"条件下不起作用?
- 如何在for循环中包含两个索引值的测试条件
- 如果条件为TRUE(最佳方式?),则在do while循环中后置增量
- 我提出什么条件才能再加5%的折扣
- 循环中的条件:为什么每次都调用strlen(),而vector.size()只调用一次
- 即使没有满足他们的条件,我也无法通过一些 do-while 循环
- 如何编写一个通用函数,该通用函数在没有任何条件和条件的情况下工作(无论是真实和错误)
- 如何将std::enable_if与一个本身取决于另一个条件的条件一起使用
- C++中的前置条件和后置条件
- 如何为static_assert的求值设置前置条件