为什么变量 "sum" 必须在函数内初始化而不是在 main 之外?

Why does a variable "sum" have to be initialized within a function but not outside of main?

为什么我不能在函数内声明 sum 变量然后 return 它? 它要求我在 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;
}

Why can't I declare the sum variable inside the function and then return it?

当然可以。问题是当你在函数中声明 sum 时你没有明确地初始化它,然后它是 default initialized 不确定值,任何使用它都会导致 UB。

Default initialization of non-class variables with automatic and dynamic storage duration produces objects with indeterminate values (static and thread-local objects get zero initialized)

你应该像

一样初始化它
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;
}

另一方面,如果您将其声明为全局变量,则它首先是 zero-initialized,即使您没有显式初始化它。

1) For every named variable with static or thread-local storage duration that is not subject to constant initialization (since C++14), before any other initialization.

我在这个程序中看到的一个问题是你必须包括 iostream

之后程序将编译但会给出错误答案,因为在函数内部定义变量时它采用随机值。

所以,sum 里面有一个随机数,它可以不是零。这就是为什么 returns 一个奇怪的数字。

如果您在函数之外定义一个变量,它会将零作为默认值,这就是为什么如果您在所有内容之外定义总和,它将起作用。

如评论中所述: 在 C++ 中,在函数内声明一个变量,用它进行计算,然后返回它的值并没有错。但是,函数中 int 类型的变量默认情况下未初始化(除非您显式初始化它),而文件范围(函数外部)的类似变量被初始化为零。做 sum += i 如果 sum 未初始化,行为是未定义的——所以一些编译器会发出警告。这并不意味着使用局部变量是错误的——这意味着您需要在首次使用之前显式初始化它。 – 彼得 1 分钟前

是的,您可以在函数内声明变量并 return 它。 它不会给出任何错误,但会 return 垃圾(在某些编译器中)。 为了防止这个初始化 sum=0; 使用这个

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

    int sum=0;
    for (int i : ar) {
        sum += i;
    }
    return sum;
}