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

时间:2015-11-11 03:11:04

标签: c++ variables scope fibonacci

我在main方法上面定义了一些全局变量。当我尝试调用函数" 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;

}

错误的代码有三个变量&#34; sum&#34;,&#34; fib1&#34;和&#34; fib2&#34;以上主要方法。为什么这不起作用,但声明函数内的变量呢?

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

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()内部没有区别。

1 个答案:

答案 0 :(得分:2)

你应该试着让你的问题更清晰。不过,我会在黑暗中拍摄,并尝试回应我认为你的问题。想一想如果将sumfib1fib2移到函数fib()之外会发生什么,换句话说就是让它们全局。他们将在函数调用中保持其价值(从技术上讲,他们有static storage duration)。因此,当您第二次调用fib()时,sum将等于fib()返回的先前值。但是,当你把它们放在函数中时,它们是 local 到那个范围,并且在每次函数调用时它们都是“新鲜”并重新初始化(技术上它们有automatic storage duration)。