为什么变量 "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;
}
为什么我不能在函数内声明 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;
}