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

C++循环累加时int/float数组结果异常double正常的原因

异常原因

代码存在两个会触发未定义行为的问题,和int、float的数值表示能力无关:

  • 局部数组未初始化,自带随机垃圾值
    声明sum[t]后你没有给任何数组元素赋初值0。C++中栈上分配的局部变量、局部数组不会自动初始化,元素值是对应栈内存位置之前残留的随机数据。你直接执行sum[i] += x,本质是在这个随机垃圾值的基础上累加输入的数字,最终输出的自然是无意义的异常值。
    换成double后运行"正常"完全是巧合:不同类型分配栈内存时的对齐规则、占用空间不同,刚好碰到的残留内存值接近0而已,本质还是未定义行为,换个编译环境、多运行几次一样会出乱值。
  • 使用了非标准的变长数组语法
    标准C不允许用运行时才获取值的变量t作为长度声明栈数组int sum[t],这是C99的语法特性,仅GCC等部分编译器做了非标准扩展支持。这种写法本身不受C标准保障,不同编译配置下运行结果可能完全不同,属于应当避免的写法。
修复方案

两处修改即可解决问题:

  1. 弃用非标准变长数组,改用C++标准库的vector容器,或者提前定义足够长度的定长数组
  2. 所有存储累加和的元素,在开始累加前必须初始化为0

修复后的可运行代码:

#include <iostream>
#include <vector>
using namespace std;

int main()
{
    int t = 0;
    int n = 0;
    int x = 0;
    cout << "Amount of sums: ";
    cin >> t;
    // 初始化长度为t的vector,所有元素默认值为0
    vector<int> sum(t);

    for (int i = 0; i < t; i++)
    {
        cout << "Sum no. " << i+1 << ". How many numbers you wish to add: ";
        cin >> n;
        for (int j = 0; j < n; j++)
        {
            cout << "Insert number " << j+1 << " : ";
            cin >> x;
            sum[i] += x;
        }
    }

    for (int i = 0; i < t; i++)
    {
        cout << sum[i] << endl;
    }

    return 0;
}

补充:你提到累加的数值范围在<-100, 300>区间,只要单次累加的总和不超过int的取值上限(主流32位int的上限为2^31-1,约21亿),用int存储完全不会出现溢出问题,之前的异常值和数值溢出没有关联。

内容的提问来源于stack exchange,提问作者HubsON

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 02:24:34