Почему, если l oop начинается с 1 до размера, он возвращает значение мусора, но когда l oop начинается с 0, он печатает правильный ответ? - PullRequest
0 голосов
/ 13 марта 2020
#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 l oop, если он начинается с 1, приводит к значению мусора.

Ответы [ 2 ]

5 голосов
/ 13 марта 2020

Это l oop:

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

использует [1], a [2], a [3], a [4] и [5]

This l oop:

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

использует [0], a [1], a [2], a [3] и a [4]

Нет [ 5]. И вы забыли [0]. Поэтому второй l oop дает вам правильный ответ, а первый l oop не дает.

1 голос
/ 13 марта 2020

Поскольку при условии for l oop i <= size вы будете читать за пределами массива, на который указывает a, на последней итерации l oop, что является причиной того, что программа имеет неопределенное поведение .

Если бы вы использовали i < size, это было бы правильно, несмотря на то, что имеет меньше смысла устанавливать i в 1, потому что индекс начинается с 0 и вы бы пропустили один элемент массива с этим, что очень важно, если вы посчитаете все значения каждого элемента вместе. * это не так - это a[0].

Таким образом, единственное решение для правильного определения sumofelements():

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

   return sum;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...