C++:Constexpr斐波那契数列评估

C++: constexpr fibonacci sequence evaluation

本文关键字:数列 评估 Constexpr C++      更新时间:2023-10-16

我正在研究constexpr,并试图在Stroustrup C++第4版第312页中实现一个例子。 我的理解是fib(45)计算应该在编译时完成,但我的结果表明计算是在运行时进行的。

有谁知道我在编译时使用constexpr建立fib(45)计算时哪里出错了?

感谢您的指导。

#include <iostream>
using namespace std;
constexpr int fib_(int n)
{
return (n < 2) ? 1 : fib_(n - 1) + fib_(n - 2);
}
constexpr int ftbl[] { 1, 2, 3, 5, 8, 13 };
constexpr int fib(size_t n)
{
return (n < sizeof(ftbl)/sizeof(*ftbl)) ? ftbl[n] : fib_(n); }

int main(int argc, char *argv[])
{
cout << fib(45) << endl;
return 0;
}

根据建议更新了代码:

#include <iostream>
using namespace std;
unsigned int fibr(unsigned int n)
{
if (n == 0)
return 0;
if (n == 1)
return 1;
return fibr(n - 1) + fibr(n - 2);
}
constexpr unsigned int ftbl[] { 0, 1, 1, 2, 3, 5, 8, 13 };
constexpr unsigned int fib(size_t n)
{
return (n < sizeof(ftbl)/sizeof(*ftbl)) ? ftbl[n] : fib(n-2) + fib(n-1);
}

int main(int argc, char *argv[])
{
if (argc == 2) {
if (string(argv[1]) == "r") {
unsigned long x = fibr(44);
cout << x << endl;
}
} else {        
constexpr unsigned long x = fib(44);
cout << x << endl;
}
return 0;
}

>constexpr表示可以在编译时计算函数。

此声明:

cout << fib(45) << endl;

不是一个需要编译时求值的上下文fib,所以编译器可能会也可能不会在运行时计算这个。

您可以强制在编译时对其进行计算,如下所示:

constexpr auto res = fib(42);
cout << res << endl;