C++ 初始化变量的值,即使我将其留空,为什么会发生这种情况? [重复]

问题描述 投票:0回答:3

由于某种原因,

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;
}
c++ initialization
3个回答
4
投票

不应该以0开头

不,它的初始值未定义。请参阅https://en.cppreference.com/w/cpp/language/default_initialization

具有自动存储持续时间的对象(及其子对象)被初始化为不确定的值。

如果你这样做

 int final_sum{}; 

或者

 int final_sum = 0; 

您的变量中将有一个

0


我建议您使用

-Wuninitialized
(或更好的
-Wall
)。如果你忘记初始化,编译器会发出警告


2
投票

如果在读取/使用变量之前没有初始化它,那就是

undefined behavior
。它的价值可以是任何东西,它是不可预测的,而且总是一个坏主意。使用

int final_sum = 0;

对其进行初始化。

来自文档

未初始化变量中的值可以是任何值——它是 不可预测,并且每次运行程序时都可能不同。 读取未初始化变量的值是未定义的行为 ——这总是一个坏主意。它必须用一个值初始化 在你可以使用它之前。

它们唯一有用的地方是当你即将阅读本文时 来自某个输入流的变量。

编辑:有些人可能会问“为什么我的变量仍然打印

0
即使我还没有初始化它?”

来自这个帖子:

这是因为具有自动存储期限的变量不是 在 C++ 中自动初始化为零。在 C++ 中,您无需付费 你不需要什么,自动初始化一个变量需要 时间(将内存位置设置为零最终会减少到机器 指令然后被转换为电信号 控制物理位)。

所以当你这样做时:

int final_sum;

final_sum
只是保留了一个内存位置,当前该位置内的任何内容都将由
cout
打印出来。恰好那个地方有一个大
0

更多信息:(为什么)使用未初始化的变量未定义行为?


0
投票

全局声明变量即可完成工作

int final_sum;
int main() {
     your code ...
}

相同
int final_sum = 0;
int main() {
    your code here ...
}

但是,您可能不想使用全局变量,并且始终建议使用某个值来初始化变量。

© www.soinside.com 2019 - 2024. All rights reserved.