这是我的代码。这里i
是静态整数作为全局整数。我在这里知道,对于n = 4,i的值应为8.但它显示为0.可能在我身上缺乏知识。请让我知道我错过了什么。
#include<iostream>
using namespace std;
static int i;
int fib(int n){
i++;
if(n==0){
return 0;
}
else if(n==1){
return 1;
}
return fib(n-1)+fib(n-2);
}
int main(){
int n;
cin>>n;
cout<<"fib("<<n<<") = "<<fib(n)<<" calls = "<<i;
}
这是我的输出:
fib(4) = 3 calls = 0
答案 0 :(得分:2)
问题在于像
这样的声明cout<<"fib("<<n<<") = "<<fib(n)<<" calls = "<<i;
输出将按您编写的顺序排列,但无法保证每个表达式的计算顺序是什么顺序。在您的示例中,首先计算i
,然后fib(n)
。
试试这个
int main(){
int n;
cin>>n;
int tmp = fib(n);
cout<<"fib("<<n<<") = "<< tmp <<" calls = "<<i;
}
答案 1 :(得分:2)
你的静态整数与它无关。问题是由于使用了operator<<,order of evaluation和operator precedence /序列点。原因是i
首先被评估,此时它等于0
并被发送到输出流。然后评估fib(n)
函数并将其发送到输出流。将表达式分为两个语句:
std::cout << "fib(" << n << ") = " << fib(n);
std::cout << " calls = " << i;
这将确保正确的评估顺序,其中fib(n)
首先得到评估,i
得到第二次评估。
答案 2 :(得分:0)
&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;在调用fib(n)之前?
从不&#34;做工作&#34;在诊断中。
你也没有把我初始化为0。
答案 3 :(得分:0)
这是因为您的编译器已过时。
正如其他答案所解释的那样,编译器在调用i
之前选择读取fib(n)
的值。但是,他们没有说明的是,当前的C ++标准要求在调用i
后读取fib(n)
的值。该程序已经完全符合您的预期。
根据C++ compiler support - cppreference,新的评估规则已在GCC 7和Clang 4中实现。您可以修改代码以使旧编译器可以接受,或者切换到更新的编译器
这是一个C ++ 17的功能,默认情况下不是在C ++ 17模式下编译。您可能需要在命令行选项中添加-std=c++17
或类似内容。