Pre and Post Condition 来自 Stroustrup 的书
Pre and Post Condition from Stroustrup's book
在《编程:使用 C++ 的原理与实践》的第 5.10.1 章中,有一个 "Try this" 练习,用于调试某个区域的错误输入。前提条件是长度和宽度的输入是否为 0 或负数,而 post 条件检查面积是否为 0 或负数。引用问题,"Find a pair of values so that the pre-condition of this version of area holds, but the post-condition doesn’t."。到目前为止的代码是:
#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;
}
虽然代码似乎有效,但我无法确定哪些输入将使先决条件成功但会触发 post 条件。到目前为止,我已经尝试在其中一个输入中输入字符串,但这只是终止程序并尝试查找等于 0 的 ascii,但结果也相同。这应该是某种技巧问题还是我遗漏了什么?
相乘导致有符号溢出的数,可能会导致结果为负数,必然导致结果不正确。
具体什么值会导致整数溢出取决于您的体系结构和编译器,但要点是两个 4 字节整数相乘将得到 8 字节值,不能存储在 4 字节整数中。
考虑对输入使用较大的值,以便乘法溢出。
我试过了,好像这样可行:area(1000000,1000000);
输出为:-727379968
在《编程:使用 C++ 的原理与实践》的第 5.10.1 章中,有一个 "Try this" 练习,用于调试某个区域的错误输入。前提条件是长度和宽度的输入是否为 0 或负数,而 post 条件检查面积是否为 0 或负数。引用问题,"Find a pair of values so that the pre-condition of this version of area holds, but the post-condition doesn’t."。到目前为止的代码是:
#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;
}
虽然代码似乎有效,但我无法确定哪些输入将使先决条件成功但会触发 post 条件。到目前为止,我已经尝试在其中一个输入中输入字符串,但这只是终止程序并尝试查找等于 0 的 ascii,但结果也相同。这应该是某种技巧问题还是我遗漏了什么?
相乘导致有符号溢出的数,可能会导致结果为负数,必然导致结果不正确。
具体什么值会导致整数溢出取决于您的体系结构和编译器,但要点是两个 4 字节整数相乘将得到 8 字节值,不能存储在 4 字节整数中。
考虑对输入使用较大的值,以便乘法溢出。
我试过了,好像这样可行:area(1000000,1000000);
输出为:-727379968