C++局部变量更改值
C++ local variable changes value
我有以下 c++ 函数,它试图在负整数和正整数数组中找到最大子数组总和
int MaxSubArray::find_max_subarray(void) {
int maxsofar =0 ;
int maxendinghere = 0;
for(int i = 0;i <= arr_size; i++) {
cout << "maxending here is: " << maxendinghere << endl;
cout << "maxsofar is: " << maxsofar << endl;
maxendinghere += array[i];
maxendinghere = max(0,maxendinghere);
maxsofar = max(maxendinghere,maxsofar);
}
int retvalue = maxsofar;
cout << "Max so far final is" << maxsofar << endl;
cout << "Max ending here is " << maxendinghere << endl;
return retvalue;
}
对于包含 10,20,30,-50、50 的数组,我得到以下输出
maxending here is: 0
maxsofar is: 0
maxending here is: 10
maxsofar is: 10
maxending here is: 30
maxsofar is: 30
maxending here is: 60
maxsofar is: 60
maxending here is: 10
maxsofar is: 60
maxending here is: 60
maxsofar is: 60
Max so far final is135205
Max ending here is 135205
Max sub array is 135205
谁能告诉我为什么变量maxsofar在for循环之外将值更改为135205。提前致谢
不应该是:
for(int i = 0; i < arr_size; i++)
?
请注意,在打印后,您在最后一次循环迭代中修改了maxsofar
,这就是您看到差异的原因 - 由于您的逐个循环边界,您可能会在最后一次迭代中添加垃圾值。
希望你喜欢编程珍珠。
for(int i = 0;i <= arr_size; i++)
应该是
for(int i = 0; i < arr_size; i++)
^^^
您正在超越数组边界。
for(int i = 0;i <= arr_size; i++) {
确定不应该<
吗?通常 size 意味着 0 到 size-1 是该数组的有效索引。
for(int i = 0;i < arr_size; i++) {
这可能会导致您覆盖数组并写入另一个堆栈变量。
假设arr_size
实际上是数组的大小,您的<=
运算符导致您最后运行一个,将垃圾添加到总和中。
由于循环约束:
for(int i = 0;i <= arr_size; i++)
您正在执行一个额外的步骤,因此您正在查看数组之外的索引,因此具有一些随机值。
它应该是:
for(int i = 0;i < arr_size; i++)
那是因为你在数组边界之外读取了一个垃圾:
for(int i = 0;i <= arr_size; i++) { // should be i < arr_size
循环中溢出数组大小。for 循环应为:
for(int i = 0;i < arr_size; i++)
请注意代码中的<=
与上述<
之间的差异。进行适当的更改,就不会使阵列溢出。:)
i <= arr_size
应该是
i < arr_size
你在循环的顶部打印出maxsofar,所以你没有在迭代后捕获它的值。 值在循环内部更改,而不是在循环外部更改。
这在您的情况下尤其有害,因为正如其他人指出的那样,您的最后一次迭代超过了数组的末尾,向计数器中添加了一个无意义的值。
遍历数组的惯用方法是:
for (int i = 0; i < length; ++i)
{
// do Stuff
}
相关文章:
- 使用的未初始化局部变量'Quick'
- 修复未初始化的局部变量错误
- 局部变量保留函数中的值
- 如何使用 C++ 中的继承函数访问派生类中的局部变量
- 将引用分配给局部变量,如果局部变量超出范围,它会超出范围吗?
- Gnuplot_i.hpp C++接口绘制局部变量而不是文件
- 如何在函数外部访问函数中局部变量的值?
- 赋予全局变量而不是局部变量优先级的函数 - (异常行为)
- C++中静态方法的局部变量范围
- 未初始化的局部变量错误甚至认为我初始化了它(C++)
- 离开范围后如何保护局部变量的值?
- 局部变量名称冲突
- C++ lambda:如何'freeze'局部变量的值?
- 我应该使我的局部变量常量还是可移动的
- 获取具有静态局部变量的绑定/推断捕获 lambda 的函数指针
- 全局和局部变量初始化与 constexpr 的差异背后的基本原理
- 返回对局部变量 - C++ 的引用
- 是否可以影响 C++ 中回调函数的局部变量?
- 警告 C4101 未引用的局部变量
- 线程局部变量的初始化顺序