为什么需要将int变量初始化为0?

6

我刚刚编写了一个程序,要求输入5到10之间的数字,然后计算输入数字的总和。以下是代码:

#include <iostream>
#include <cstdlib>

using namespace std;

int main()
{
    int a,i,c;
    cout << "Enter the number between 5 and 10" << endl;
    cin >> a;
    if (a < 5 || a > 10)
    {
        cout << "Wrong number" << endl;
        system("PAUSE");
        return 0;
    }
    for(i=1; i<=a; i++)
    {
        c=c+i;
    }
    cout << "The sum of the first " << a << " numbers are " << c << endl;
    system("PAUSE");
    return 0;
}

如果我输入数字5,它应该显示:
“前5个数字的总和为15”,但是它却显示:
“前5个数字的总和为2293687”。
当我将c设置为0时,它就可以正确地工作了。
那么问题出在哪里呢?
5个回答

21
因为 C++ 不会自动将其设置为零。因此,你需要自己进行初始化:
int c = 0;

未初始化的变量具有随机数,例如2293687-2199999等(如果读取时不会触发未定义行为)。

此外,static变量将被设置为它们的默认值。在这种情况下为0


如果按照你所写的方式声明和初始化c,它会放在堆栈区吗? - tomer.z
@tomer.z:这取决于你在哪里编写它。例如,在全局区域或函数声明中... - masoud

8
如果您不将 c 设置为 0 ,它可以采用任何值(在技术上是不确定的值)。 如果您接下来执行以下操作: c = c + i; 那么您正在将 i 的值添加到可能是任何内容的东西中。 在技术上,这是未定义行为。 在实践中发生的情况是,您无法依赖该计算的结果。
在C ++中,非静态或全局内置类型在“默认初始化”时不执行初始化。 为了将 int 清零,您需要明确指出:
int i = 0;

或者您可以使用值初始化:

int i{};
int j = int();

最后一行也可以缩写为 int j(); 用于局部变量。 - unknown6656
2
@unknown6656 这将是一个函数声明。 - juanchopanza
是的,没关系。但是 'int j(0);' 应该是合法的,不是吗? - unknown6656

5

非静态变量在定义时未被初始化,它们的初始值是未定义的。

在另一个编译器上,你可能会得到正确的答案,也可能得到错误的答案,或者每次都得到不同的答案。

C/C++ 不会做额外的工作(将变量初始化为零至少需要一两条指令),除非你要求它们这样做。


0

前五个数字的总和为2293687。

这是因为如果不初始化c,你会得到之前存储在该位置的值(垃圾值)。这将使您的程序行为未定义。在程序中使用c之前,必须对其进行初始化。

int c= 0;

0

因为当你执行以下操作时:

int a,i,c;

因此,实例化和初始化c时,您没有说明要将其初始化为什么。 这里的规则有些复杂,但归结为两件事:

  1. 对于整数类型,如果您不指定初始化程序,则变量的值是不确定的
  2. 当您尝试读取未初始化的变量时,会引发未定义行为

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接