【问题标题】:Why my static integer is not showing the changed value in the main function?为什么我的静态整数没有在主函数中显示更改的值?
【发布时间】:2018-06-20 18:51:24
【问题描述】:

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

【问题讨论】:

  • @carl I 的值是在函数调用之前计算出来的。用 std::cout 将此语句拆分为两个语句。

标签: c++ recursion static fibonacci


【解决方案1】:

你的静态整数与它无关。问题是由于使用了operator<<order of evaluationoperator precedence / 序列点。原因是i 首先被评估,此时它等于0 并被发送到输出流。然后fib(n) 函数被评估并发送到输出流。改为将表达式分成两个语句:

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

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

【讨论】:

  • 它对我有用!但无法理解同一行有什么问题。无论如何,谢谢你。
【解决方案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;
}

【讨论】:

    【解决方案3】:

    在调用 fib(n) 之前

    永远不要在诊断中“工作”。

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

    【讨论】:

    • i 由编译器初始化。
    • @Vlad,很公平。遗憾的是我的编码早于 C99,所以这仍然在我的命中列表中。
    【解决方案4】:

    这是因为你的编译器已经过时了。

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

    根据C++ compiler support - cppreference,新的评估规则已在 GCC 7 和 Clang 4 中实现。您可以修改代码以使旧编译器可以接受,或者切换到更新的编译器。

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

    【讨论】:

    • 但是,这只是 c++17 的强制要求。如果您不使用该选项(或更高选项)进行编译,您可能无法获得该行为。
    • @GemTaylor 好电话。对于 GCC,我认为这也适用于较旧的标准版本,但我现在认为我可能误读了。对于铿锵声,我不知道一种方法。
    • 我并不是说你不会得到这种行为,但一些编译器编写者可能认为向后一致性比延迟特性共享更重要。
    猜你喜欢
    • 2019-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-06
    • 2017-03-23
    • 2021-04-12
    • 2017-08-14
    • 1970-01-01
    相关资源
    最近更新 更多