主要方法之外的变量出现奇怪的问题?

Getting bizarre issue with variables outside the main method?

我在我的主要方法上方定义了一些全局变量。当我在使用这些变量时尝试调用函数 "fib()" 时,我得到了不正确的结果。

当我将变量移动到函数的局部范围时,我得到了正确的结果。

为什么会这样?这是正确的代码:

using namespace std;
#include <iostream>
#include <vector>

vector <int> fibVals;
int fibInput;

int fib(int n);

int main()
{

    cout << "Please enter 3 Fibonacci numbers you wish to find:: \n";

    for(int i = 0; i < 3; i++)
    {
        cin >> fibInput;
        fibVals.push_back(fibInput);
    } 

    cout << "The values at those Fibonacci numbers are(in order)::\n";

    for(int i = 0; i < 3; i++)
    {
         cout << fib( fibVals[i] ) << "\n";

    }

    return 0;
}


int fib(int n)
{

    int sum = 0;
    int fib1 = 1;
    int fib2 = 0;


    if (n == 0 || n == 1)
        return n;


    for(int i = 2; i <= n; i++)
    {

        sum = fib1 + fib2;

        fib2 = fib1;

        fib1 = sum;

    }

    return sum;

}

错误的代码在main方法上面有"sum"、"fib1"、"fib2"三个变量。为什么这不起作用,但在函数内部声明变量却起作用?

编辑:下面是错误的代码。请注意,唯一的区别是变量的位置。

using namespace std;
#include <iostream>
#include <vector>

vector <int> fibVals;
int fibInput;

int fib(int n);


int sum = 0;
int fib1 = 1;
int fib2 = 0;

int main()
{

    cout << "Please enter 3 Fibonacci numbers you wish to find:: \n";

    for(int i = 0; i < 3; i++)
    {
        cin >> fibInput;
        fibVals.push_back(fibInput);
    } 

    cout << "The values at those Fibonacci numbers are(in order)::\n";

    for(int i = 0; i < 3; i++)
    {
         cout << fib( fibVals[i] ) << "\n";

    }

    return 0;
}


int fib(int n)
{

    if (n == 0 || n == 1)
        return n;


    for(int i = 2; i <= n; i++)
    {

        sum = fib1 + fib2;

        fib2 = fib1;

        fib1 = sum;

    }

    return sum;

}

我理解作用域的概念。我 认为 将这三个变量设置为全局变量(在 main 之外)与将它们设置为本地变量(在 fib() 内部)没有区别。

你应该尽量让你的问题更清楚。尽管如此,我还是会在黑暗中试一试,并尝试回答我认为你的问题是什么。想一想如果将 sumfib1fib2 移到函数 fib() 之外会发生什么,换句话说,您将它们设为 global .它们将在函数调用中保持它们的值(从技术上讲,它们有 static storage duration). Hence, when you invoke fib() the second time, sum will be equal to the previous value returned by fib(). However, when you put them inside the function, they are local to that scope, and at each function invocation they start "fresh" and are re-initialized (technically they have automatic storage duration)。