《C++编程:原理与实践》5.10.1节调试练习:求前置满足但后置不满足的输入
解决《C++编程:原理与实践》5.10.1节的调试问题
嘿,这个问题的核心在于理解有符号整数的乘法特性,我们需要找一组输入满足「长度和宽度都是0或负数」的前置条件,但计算出的面积却是正数(也就是后置条件不成立)。
最简单的有效输入
最直接的例子就是输入两个非零的负数,比如:
- 长度:
-5 - 宽度:
-6
当计算面积时,-5 * -6 = 30——结果是正数,完全符合要求:前置条件(输入都是负数)成立,但后置条件(面积为0或负数)不成立。
极端边界的整数溢出场景
如果想测试更极端的情况,可以利用32位有符号整数的溢出特性(这属于C++标准中的未定义行为,但在大多数使用二进制补码的系统中会有可预测的结果)。比如:
假设使用32位int类型(取值范围是 -2147483648 到 2147483647),输入:
- 长度:
-2147483648 - 宽度:
-1
数学上的乘积是 2147483648,但这个值超出了32位有符号整数的最大值,在补码系统中会被截断为 -2147483648?不对,换个更准确的例子:输入-1000000000 * -3,数学结果是3000000000,超过32位int的最大值2147483647,溢出后会变成负数,但如果是-2 * -2这种小数值相乘,结果是正数,反而更直观地满足题目要求。
验证用的代码示例
假设原书的代码大致如下:
#include <iostream> #include "std_lib_facilities.h" int main() { int length, width; std::cout << "Enter length and width: "; std::cin >> length >> width; // 前置条件:length 和 width 为 0 或负数 int area = length * width; // 后置条件:area 为 0 或负数 if (area <= 0) { std::cout << "Area is non-positive (expected)\n"; } else { std::cout << "Area is positive (unexpected - postcondition failed)\n"; } return 0; }
当你输入-5 -6时,程序会输出Area is positive (unexpected - postcondition failed),完美复现了题目要求的场景。
内容的提问来源于stack exchange,提问作者mcbalsa
相关产品推荐
相关产品推荐

