为什么我的静态整数没有在main函数中显示更改的值?

时间:2018-01-11 12:29:13

标签: c++ recursion static fibonacci

这是我的代码。这里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

4 个答案:

答案 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 evaluationoperator 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或类似内容。