C++局部变量更改值

C++ local variable changes value

本文关键字:局部变量 C++      更新时间:2023-10-16

我有以下 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
}