【问题标题】:Getting bizarre issue with variables outside the main method?主要方法之外的变量会出现奇怪的问题吗?
【发布时间】:2015-11-11 03:11:03
【问题描述】:

我在 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;

}

错误代码在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() 内部)没有区别。

【问题讨论】:

  • “进入函数的本地作用域”是什么意思?
  • 我们必须查看不起作用的代码才能知道原因。也许你没有正确初始化变量,谁知道呢。再次显示失败的代码。
  • 请发表您的输入、输出和预期输出。
  • 这将是一个很好的机会来 (a) 了解什么是全局变量,以及 (b) 学习如何使用调试器,这将很容易揭示问题所在。我很好奇是什么迫使你想在全球范围内宣布它们?你认为这意味着什么?
  • 没有人会雇用任何认为这是个好主意的人!?!?

标签: c++ variables scope fibonacci


【解决方案1】:

你应该尽量让你的问题更清楚。尽管如此,我还是会在黑暗中试一试,并尝试回答我认为您的问题。想想如果将sum、fib1 和fib2 移到函数fib() 之外会发生什么,换句话说,你将它们设为全局。他们将在函数调用中保持其价值(从技术上讲,他们拥有static storage duration)。因此,当您第二次调用fib() 时,sum 将等于fib() 返回的前一个值。但是,当您将它们放在函数中时,它们是该范围的本地,并且在每次函数调用时,它们都会“重新”开始并重新初始化(从技术上讲,它们具有automatic storage duration)。

【讨论】:

  • 天哪,就是这样。感谢您指出了这一点。我完全忽略了一个事实,即变量在主变量之外时会保持它们的值。非常感谢!
猜你喜欢
  • 2017-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-24
  • 2012-01-30
  • 1970-01-01
  • 1970-01-01
  • 2014-04-06
相关资源
最近更新 更多