You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

《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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:43:46