繁体   English   中英

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

[英]Why does the following code depend on when I initialize the variable?

我正在阅读一本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行。我不明白为什么程序的行为不同而且希望能更好地理解问这个问题是怎么回事。

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

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

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

让我们来看看你的程序:

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.

现在,第一次将triangleNumber指向的地址处的内存更改为保存值,值为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;

}

如果你在第二个for循环中初始化“triangulerNumber = 0”,那么你的问题的答案就是你的问题的原因:如果你在第二个for循环中初始化triangularNumber = 0那么它将在第二个for循环的每次迭代中变为零并且你的答案只是“数字”,因为:

triangularNumber=0;
triangularNumber=triangularNumber+n;

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM