主要方法之外的变量出现奇怪的问题?
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() 内部)没有区别。
你应该尽量让你的问题更清楚。尽管如此,我还是会在黑暗中试一试,并尝试回答我认为你的问题是什么。想一想如果将 sum
、fib1
和 fib2
移到函数 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)。
我在我的主要方法上方定义了一些全局变量。当我在使用这些变量时尝试调用函数 "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() 内部)没有区别。
你应该尽量让你的问题更清楚。尽管如此,我还是会在黑暗中试一试,并尝试回答我认为你的问题是什么。想一想如果将 sum
、fib1
和 fib2
移到函数 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)。