【问题标题】:Why if the loop starts with 1 to size it returns garbage value but when loop starts from 0 it prints valid answer?为什么如果循环从 1 开始到 size 它返回垃圾值但是当循环从 0 开始时它打印有效答案?
【发布时间】:2020-03-13 16:12:57
【问题描述】:
#include <stdio.h>
int sumofelements(int a[],int size)
{
   int i,sum=0;
   for (i=1;i<=size;i++)  
   {
      sum+=a[i];
   }
   return sum;
}

int main()
{
   int a[]={1,2,3,4,5};
   int size=sizeof(a)/sizeof(a[0]);
   int soe=sumofelements(a,size);
   printf("sum of the elements=%d\n",soe);
}

sumofelements 中的错误,如果 for 循环以 1 开头,则会产生垃圾值。

【问题讨论】:

  • 因为当你使用for (i = 1; i &lt;= size; i++) 时,你正在读取数组的边界,调用未定义的行为。可用的元素从a[0]a[size-1]。不要读取数组的边界。在 C 中,惯用循环使用 for (int i = 0; i &lt; size; i++)
  • 为什么要从 1 开始?您可以省略一个元素,因为第一个元素的索引计数从 0 开始。
  • for 声明没有任何问题。总和应该是+= a[i-1];

标签: c function for-loop pointers


【解决方案1】:

这个循环:

for (i=1;i<=size;i++)  
{
   sum+=a[i];
}

使用 a[1]、a[2]、a[3]、a[4] 和 a[5]

这个循环:

for (i=0;i<size;i++)  
{
   sum+=a[i];
}

使用 a[0]、a[1]、a[2]、a[3] 和 a[4]

没有a[5]。你忘记了[0]。所以第二个循环给了你正确的答案,而第一个循环没有。

【讨论】:

    【解决方案2】:

    由于for 循环条件i &lt;= size,您将在循环的最后一次迭代中读取超出数组a 指向的边界,这就是程序具有undefined behavior 的原因。

    如果您使用i &lt; size,这将是正确的,尽管将i 设置为1 意义不大,因为索引计数从0 开始,并且您会省略一个数组元素,这很重要如果将每个元素的所有值一起计算。

    我认为你的整个混淆只是因为你可能认为第一个元素是a[1],但事实并非如此——它是a[0]

    因此,正确定义sumofelements() 的唯一解决方案是:

    int sumofelements(int a[],int size)
    {
       int i,sum=0;
       for (i=0;i<size;i++)  
       {
           sum+=a[i];
       }
    
       return sum;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-15
      • 1970-01-01
      • 2021-06-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多