由于某种原因,
final_sum
的值是16,但我没有初始化该变量的值,为什么呢?不是应该以0
开头吗?
#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;
int main()
{
int n, sum, final_sum;
cout<<"ff: "<<final_sum<<endl;
cout<<"Input the value for n: ";
cin>>n;
for(int i=1; i<=n; i++){
sum += i;
final_sum += sum;
cout<<"sum: "<<sum<<endl;
cout<<"final sum: "<<final_sum<<endl<<endl;
}
return 0;
}
不应该以0开头
不,它的初始值未定义。请参阅https://en.cppreference.com/w/cpp/language/default_initialization
具有自动存储持续时间的对象(及其子对象)被初始化为不确定的值。
如果你这样做
int final_sum{};
或者
int final_sum = 0;
您的变量中将有一个
0
。
我建议您使用
-Wuninitialized
(或更好的-Wall
)。如果你忘记初始化,编译器会发出警告
如果在读取/使用变量之前没有初始化它,那就是
undefined behavior
。它的价值可以是任何东西,它是不可预测的,而且总是一个坏主意。使用
int final_sum = 0;
对其进行初始化。
来自文档:
未初始化变量中的值可以是任何值——它是 不可预测,并且每次运行程序时都可能不同。 读取未初始化变量的值是未定义的行为 ——这总是一个坏主意。它必须用一个值初始化 在你可以使用它之前。
和
它们唯一有用的地方是当你即将阅读本文时 来自某个输入流的变量。
编辑:有些人可能会问“为什么我的变量仍然打印
0
即使我还没有初始化它?”
来自这个帖子:
这是因为具有自动存储期限的变量不是 在 C++ 中自动初始化为零。在 C++ 中,您无需付费 你不需要什么,自动初始化一个变量需要 时间(将内存位置设置为零最终会减少到机器 指令然后被转换为电信号 控制物理位)。
所以当你这样做时:
int final_sum;
final_sum
只是保留了一个内存位置,当前该位置内的任何内容都将由cout
打印出来。恰好那个地方有一个大0
。
更多信息:(为什么)使用未初始化的变量未定义行为?
全局声明变量即可完成工作
int final_sum;
int main() {
your code ...
}
与
相同int final_sum = 0;
int main() {
your code here ...
}
但是,您可能不想使用全局变量,并且始终建议使用某个值来初始化变量。