C++循环累加时int/float数组结果异常double正常的原因
异常原因
代码存在两个会触发未定义行为的问题,和int、float的数值表示能力无关:
- 局部数组未初始化,自带随机垃圾值
声明sum[t]后你没有给任何数组元素赋初值0。C++中栈上分配的局部变量、局部数组不会自动初始化,元素值是对应栈内存位置之前残留的随机数据。你直接执行sum[i] += x,本质是在这个随机垃圾值的基础上累加输入的数字,最终输出的自然是无意义的异常值。
换成double后运行"正常"完全是巧合:不同类型分配栈内存时的对齐规则、占用空间不同,刚好碰到的残留内存值接近0而已,本质还是未定义行为,换个编译环境、多运行几次一样会出乱值。 - 使用了非标准的变长数组语法
标准C不允许用运行时才获取值的变量t作为长度声明栈数组int sum[t],这是C99的语法特性,仅GCC等部分编译器做了非标准扩展支持。这种写法本身不受C标准保障,不同编译配置下运行结果可能完全不同,属于应当避免的写法。
修复方案
两处修改即可解决问题:
- 弃用非标准变长数组,改用C++标准库的
vector容器,或者提前定义足够长度的定长数组 - 所有存储累加和的元素,在开始累加前必须初始化为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
相关产品推荐
相关产品推荐

