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