Stroustrup的书中的前后条件

时间:2018-04-11 14:45:36

标签: c++ preconditions post-conditions

在编程:使用C ++的原理和实践的章节5.10.1中,有一个“试试这个”练习用于调试区域的错误输入。前提条件是长度和宽度的输入为0或负,而后置条件检查区域是0还是负。引用问题,“找到一对值,以便该版本区域的前提条件成立,但后置条件不成立。”到目前为止的代码是:

#include <iostream>
#include "std_lib_facilities.h"

int area (int length, int width) {
    if (length <= 0 || width <= 0) { error("area() pre-condition"); }
    int a =  length * width;
    if(a <= 0) { error("area() post-condition"); }
    return a;
}

int main() {

int a;
int b;
while (std::cin >> a >> b) {
    std::cout << area(a, b) << '\n';
}

system("pause");
return 0;
}

虽然代码似乎有效,但我无法理解哪些输入会使先决条件成功但会触发后置条件。到目前为止,我已经尝试将字符串输入到其中一个输入中,但这只是终止程序并尝试查找等效于0的ascii,但同样的结果。这应该是某种技巧问题,还是我错过了什么?

3 个答案:

答案 0 :(得分:1)

考虑为输入使用较大的值,以便乘法溢出。

答案 1 :(得分:0)

当相乘时导致有符号溢出的数字可能会导致该值为负值,并且肯定会导致结果不正确。

究竟什么值导致整数溢出将取决于您的体系结构和编译器,但要点是乘以两个4字节整数将产生一个8字节值,不能存储在4字节整数中。

答案 2 :(得分:0)

我试过这个,看起来很有效:area(1000000,1000000);

输出为:-727379968