4

我刚刚制作了这个程序,它要求输入 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

它可以正常工作

那么区别是什么呢 ?

4

5 回答 5

19

因为 C++ 不会自动为您设置为零。所以,你应该自己初始化它:

int c = 0;

未初始化的变量有一个随机数,例如2293687, -21, , ... (如果它在读取时99999没有调用未定义的行为)

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

于 2013-10-29T18:05:08.147 回答
6

如果您不设置c0,它可以采用任何值(从技术上讲,是一个不确定的值)。如果你这样做

c = c + i;

那么你正在将价值添加i到可能是任何东西的东西上。从技术上讲,这是未定义的行为。在实践中发生的事情是您不能依赖该计算的结果。

在 C++ 中,非静态或全局内置类型在“默认初始化”时不执行初始化。为了对 a 进行零初始化int,您需要明确:

int i = 0;

或者您可以使用值初始化

int i{};
int j = int();
于 2013-10-29T18:05:51.713 回答
4

根据定义,非静态变量是未初始化的——它们的初始值是未定义的。

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

C/C++ 不会做您没有要求他们做的额外工作(初始化为零涉及至少一两条指令)。

于 2013-10-29T18:06:23.490 回答
0

前 5 个数字的总和是 2293687

这是因为在没有初始化的情况下c,您将获得先前存储在该位置的值(垃圾值)。这将使您的程序的行为未定义。c在您的程序中使用它之前, 您必须进行初始化。

int c= 0;
于 2013-10-29T18:06:05.487 回答
0

因为当你这样做时:

int a,i,c;

因此实例化和初始化c,你还没有说你想要它初始化什么。这里的规则有些复杂,但归结为两件事:

  1. 对于整数类型,如果不指定初始化器,则变量的值是不确定的
  2. 当您尝试读取未初始化的变量时,您会引发未定义的行为
于 2013-10-29T18:06:09.543 回答