C++ 计算c+中的斐波那契+;函数和抛出编译时错误

C++ 计算c+中的斐波那契+;函数和抛出编译时错误,c++,c++17,fibonacci,static-assert,C++,C++17,Fibonacci,Static Assert,我需要写这个函数fibo。 如果数字太大,则应显示为编译错误(主函数的最后一行) 主要功能应该保持原样。 有什么建议吗 #include <iostream> int fibo(int n) { if (n <= 1) return n; //if (n>=300) throws ... ? return fibo(n - 1) + fibo(n - 2); } int main() { static_assert(fi

我需要写这个函数fibo。 如果数字太大,则应显示为编译错误(主函数的最后一行) 主要功能应该保持原样。 有什么建议吗

#include <iostream>

int fibo(int n)
{
    if (n <= 1)
        return n;
    //if (n>=300) throws ... ?
    return fibo(n - 1) + fibo(n - 2);
}

int main()
{
    static_assert(fibo(7) == 34);
    const int k = fibo(9);
    std::cout << k << std::endl;
    const int l = fibo(300); // 300th Fibonacci number is large for int
}
#包括
int fibo(int n)
{
如果(n=300)抛出?
返回fibo(n-1)+fibo(n-2);
}
int main()
{
静态(fibo(7)=34);
常数int k=fibo(9);

std::cout您可以使
fibo
成为
constexpr
函数,然后如果参数无效,则
throw
。如果
constexpr
函数中的
throw
在编译时求值,则会导致编译时错误,否则会导致运行时错误:

constexpr int fibo(int n)
{
    if (n >= 300) throw;
    if (n <= 1) return n; 
    return fibo(n-1) + fibo(n-2); 
}
这是一个例子


请注意,在
fibo
的定义中不能
static\u assert
,因为条件取决于函数参数,它不是一个常量表达式。

顺便说一下,300太大了。fibo将溢出一个int值以获得更小的值。@cigien我该怎么做?找到该值并将其放在if语句中300?但基本上它应该保持原样…我能请你告诉我static_assert是如何工作的吗?是的,只需查找该值。IIRC是48,或者可能是长的。
main
中的调用仍将无法编译。
static_assert
只是在编译时检查表达式是否为真。@cigien因此,因为expression(static_assert(fibo(7)==34);)不是真的没有发生任何事情?不,它强制编译器出错。请注意,我在我的答案的演示中更改了它。
int j = fibo(300);             // run time error
constexpr int k = fibo(300);   // compile time error