为什么我的静态整数没有在主函数中显示更改的值
Why my static integer is not showing the changed value in the main function?
这是我的代码。这里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
或类似的命令行选项。
相关文章:
- 使用QTreeView,如何通过调用函数只突出显示特定的行/列
- C++ 构造函数未显示输出
- 访问和打印元组中的数据,并使用 C++14 使用模板函数显示数据
- 如何修复加载图标()函数不显示图标?
- 提升堆栈跟踪不显示函数名称和行号
- 如何在函数中显示结构数组
- 如何显示函数开始、结束行和函数体?
- 如何使 Clang Complete 显示函数参数
- Visual Studio 2015 Natvis如何显示函数静态变量
- 如何在模型中显示函数的进度条
- 是否有任何工具可以显示函数中的数据依赖关系
- for 循环在显示函数 OpenGL 中调用的函数中不起作用
- GDB:显示函数将我的 {type} 的地址打印为整数——想改成十六进制
- 如何正确实现类的显示函数
- DLL导出查看器显示函数的完整签名-无法从Java调用它们
- 使用复杂的显示函数会阻止glutKeyboardFunc工作
- GDB 不显示函数名称
- c++中LinkedList调用时的显示函数
- 如何在类中显示函数
- 在过剩显示函数中使用对象