为什么以下代码依赖于我何时初始化变量?

时间:2014-02-10 06:56:15

标签: c initialization

我正在阅读一本C编程书,我有一个问题,为什么一段代码依赖于我初始化变量的时间。

可以在此处找到代码:http://paste.ubuntu.com/6907608/

#include <stdio.h>

int main(void)
{
    int n, number, counter, triangularNumber;

    for(counter = 1; counter <= 5; ++counter)
    {
        printf("What triangular number do you want? ");
        scanf("%i", &number);

        triangularNumber = 0; // Line 12: I was having a hard time with this program because
                              // I kept forgetting to initialize triangularNumber to 0.

        for(n = 1; n <= number; ++n)
        {
            triangularNumber += n;
        }

        printf("Triangular number %i is %i\n\n", number, triangularNumber);
        n = 0;
        triangularNumber = 0;
    }

    return 0;
}

正如您在第12行中看到的,我在第二个for循环之前初始化变量triangularNumber = 0。

我无法理解的是当我在第二个for循环中初始化triangularNumber = 0时程序失败的原因,比如第17行。我不明白为什么程序的行为不同而且希望得到一个通过提问来更好地了解正在发生的事情。

3 个答案:

答案 0 :(得分:2)

绊倒你的事情似乎是变量的初始化方式。当你声明一个全局变量(即在main()之外)时,它被初始化为零。当您声明局部变量时,正如您在此处所做的那样,它根本没有初始化,因此它会以一些未知数字开头,直到您将其设置为值。

因此,如果没有第12行,通过外部循环的第一次迭代正在使用triangleNumber中的未知值,并且可能是您看到了垃圾输出。

如果有的话,你的第12行是正确的,外部循环结束处的行,将n和triangleNumber重置为0,是多余的。

答案 1 :(得分:1)

让我们来看看你的计划:

int main(void)
{
     int n, number, counter, triangularNumber;

创建指向n,number,counter,triangularNumber的指针。现在在内存中的某个地方,存在存储这些内容的值的空间。这个地方还没有清理过。

for(counter = 1; counter <= 5; ++counter)
{
    printf("What triangular number do you want? ");
    scanf("%i", &number);

    triangularNumber = 0; // Line 12: I was having a hard time with this program because
                          // I kept forgetting to initialize triangularNumber to 0.

现在,第一次将trigN指向的地址的内存更改为保存值,值为0.

    for(n = 1; n <= number; ++n)
    {
        triangularNumber += n;

如果你没有在第12行将triangularNumber设置为0,那么第一次通过这个循环时,triangleNumber会有一个未知值。

    }

    printf("Triangular number %i is %i\n\n", number, triangularNumber);
    n = 0;
    triangularNumber = 0;

不需要,无论如何都会丢弃对这些地址的引用,并且内存可以自由使用其他内容。

}

return 0;

}

答案 2 :(得分:1)

如果您在第二个for循环中初始化“triangulerNumber = 0”,则回答您的问题,这就是您的程序工作方式不同的原因: 如果你在第二个for循环中初始化triangularNumber = 0,那么它将在第二个for循环的每次迭代中变为零,你的答案将只是“数字”,因为:

triangularNumber=0;
triangularNumber=triangularNumber+n;

但是在最后一次迭代时n = number.So我认为现在很清楚为什么你不能在第二个for循环中初始化triangularNumber。 如果有任何问题你可以问.....