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

Why my static integer is not showing the changed value in the main function?

本文关键字:显示 函数 静态 我的 整数 为什么      更新时间:2023-10-16

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

您的静态整数与它无关。该问题是由于使用了运算符<<、计算顺序和运算符优先级/序列点。原因是首先评估i此时等于0并发送到输出流。然后,fib(n)函数被计算并发送到输出流。将表达式分解为两个语句:

std::cout << "fib(" << n << ") = " << fib(n);
std::cout << " calls = " << i;

这将确保正确的评估顺序,首先评估fib(n),其次评估i

这里的问题是,在这样的语句中

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;
}

调用 fib(n( 之前,<<正在读取的值 i?

永远不要在诊断中"工作"。

您也没有将 i 初始化为 0。

发生这种情况是因为您的编译器已过时。

正如其他答案所解释的那样,编译器选择在调用fib(n)之前读取i的值。但是,他们没有告诉的是,当前的C++标准要求在调用fib(n)后读取i的值。该程序已经应该完全按照您的期望执行。

根据C++编译器支持 - cpp首选项,新的评估规则已在 GCC 7 和 Clang 4 中实现。您可以修改代码以使其被较旧的编译器接受,也可以切换到更新的编译器。

不过,这是一个 C++17 功能,默认设置是不在 C++17 模式下编译。您可能需要添加-std=c++17或类似的命令行选项。