【问题标题】:C++ local variable changes valueC++ 局部变量改变值
【发布时间】:2011-09-02 18:24:03
【问题描述】:

我有以下 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。 提前致谢

【问题讨论】:

  • 只是匆匆忙忙,您在分配值之前正在执行 couts,在 for 循环的最后一次迭代期间值可能会发生变化。将 couts 移到分配后并查看该输出。

标签: c++ local


【解决方案1】:

不应该是:

for(int i = 0; i < arr_size; i++)

?

请注意,您在最后一次循环迭代中修改了maxsofar打印它之后,这就是为什么您会看到差异 - 您可能在最后一次迭代中添加了垃圾值因为你的单循环边界。

希望您喜欢Programming Pearls

【讨论】:

  • 是的,他对数组之外的项目进行了另一次迭代,这是垃圾。
【解决方案2】:

这个

for(int i = 0;i <= arr_size; i++)

应该是

for(int i = 0; i < arr_size; i++)
                ^^^

您超出了数组范围。

【讨论】:

    【解决方案3】:
    for(int i = 0;i <= arr_size; i++) {
    

    确定不应该是&lt;?通常 size 意味着 0 到 size-1 是该数组的有效索引。

     for(int i = 0;i < arr_size; i++) {
    

    这可能会导致您覆盖数组并写入另一个堆栈变量。

    【讨论】:

      【解决方案4】:

      假设 arr_size 实际上是数组的大小,您的 &lt;= 运算符会导致您在最后运行一个,将垃圾添加到总和中。

      【讨论】:

        【解决方案5】:

        因为循环约束:

        for(int i = 0;i <= arr_size; i++)
        

        您正在做一个额外的步骤,因此您正在查看数组外部的索引,因此具有一些随机值。

        应该是:

        for(int i = 0;i < arr_size; i++)
        

        【讨论】:

          【解决方案6】:

          那是因为你读到了数组边界之外的垃圾:

          for(int i = 0;i <= arr_size; i++) { // should be i < arr_size
          

          【讨论】:

            【解决方案7】:

            您在循环中溢出了数组大小。 for 循环应该是:

            for(int i = 0;i < arr_size; i++)
            

            注意代码中的&lt;= 和上面的&lt; 之间的区别。进行适当的更改,您就不会溢出数组。 :)

            【讨论】:

              【解决方案8】:
              i <= arr_size
              

              应该是

              i < arr_size
              

              【讨论】:

                【解决方案9】:

                您在循环顶部打印出 maxsofar,因此您没有捕获迭代后它的值。值是在循环内部更改的,而不是在循环外部。

                这对您的情况特别有害,因为正如其他人所指出的那样,您的最后一次迭代超出了数组的末尾,向您的计数器添加了一个无意义的值。

                遍历数组的惯用方式是:

                for (int i = 0; i < length; ++i)
                {
                   // do Stuff
                }
                

                【讨论】:

                • 哎哟!!这真是让我傻了眼。在提出问题之前应该查看我的代码。对不起,伙计们..感谢您的帮助
                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多