Почему переменная «sum» должна быть инициализирована внутри функции, а не вне main? - PullRequest
1 голос
/ 18 апреля 2020

Почему я не могу объявить переменную sum внутри функции и затем вернуть ее? Требуется, чтобы я создал переменную вне функции main.

#include <iostream>
#include <string>
#include <vector>

int simpleArraySum(std::vector<int> ar);
//int sum;

int main() 
{
    std::vector<int> ar = { 1, 2, 3 };
    std::cout << simpleArraySum(ar);

}

int simpleArraySum(std::vector<int> ar) 
{
    int sum{};
    for (int i : ar) {
        sum += i;
    }
    return sum;
}

Ответы [ 4 ]

1 голос
/ 18 апреля 2020

Почему я не могу объявить переменную sum внутри функции, а затем вернуть ее?

Можно, конечно. Проблема в том, что когда вы объявляете sum в функции, которую вы не инициализировали явно, тогда по умолчанию инициализируется для неопределенного значения, любое его использование приводит к UB.

Инициализация по умолчанию для неклассовых переменных с автоматическим c и динамическим c сроком хранения создает объекты с неопределенными значениями (stati c, а локальные объекты потока получают инициализированные нулями )

Вы должны инициализировать его как

int simpleArraySum(const std::vector<int>& ar) // better to pass-by-reference to avoid copy of the vector 
{
    int sum = 0; // copy-initialize to 0
    for (int i : ar) {
        sum += i;
    }
    return sum;
}

С другой стороны, если вы объявите его как глобальную переменную, он будет инициализирован нулями во-первых, даже если вы не не инициализируйте его явно.

1) Для каждой именованной переменной со stati c или продолжительностью локального хранилища потока that is not subject to constant initialization (since C++14) перед любой другой инициализацией.

0 голосов
/ 18 апреля 2020

Да, вы можете объявить переменную внутри функции и вернуть ее. Это не даст никакой ошибки, но вернет мусор (в некоторых компиляторах). чтобы предотвратить это инициализировать сумму = 0; используйте это

int simpleArraySum(std::vector<int> ar) 
{

    int sum=0;
    for (int i : ar) {
        sum += i;
    }
    return sum;
}
0 голосов
/ 18 апреля 2020

Как и в комментариях: в C ++ нет ничего плохого в том, чтобы объявить переменную внутри функции, выполнить с ней вычисления, а затем вернуть ее значение. Однако переменная типа int в функции неинициализируется по умолчанию (если вы явно не инициализируете ее), тогда как аналогичная переменная в области видимости файла (вне функции) инициализируется нулем. Чтобы сделать sum + = i, поведение не определено, если сумма неинициализирована - поэтому некоторые компиляторы будут выдавать предупреждения об этом. Это не означает, что использование локальной переменной является неправильным - это означает, что вам нужно явно инициализировать ее перед первым использованием. - Питер 1 мин. go

0 голосов
/ 18 апреля 2020

Одна проблема, которую я вижу в этой программе, заключается в том, что вы должны включить iostream.

После этого программа скомпилируется, но даст неправильный ответ, потому что при определении переменной внутри функции требуется случайное значение.

Итак, внутри суммы есть случайное число, которое может быть отличным от нуля. Вот почему он возвращает странное число.

Если вы определяете переменную вне функции, в качестве значения по умолчанию принимается ноль, поэтому, если вы определите сумму вне всего, она будет работать.

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