首页 > 解决方案 > 如何修复“错误:控制到达非无效函数的结尾”?

问题描述

int climbStairs(int n ){

    if(n==1){
        return 1;
    }
    if (n>=2){
         return (2+ climbStairs(n-2)+ climbStairs(n-1));
    }
}

在此处输入图像描述

如何修复编译器错误?

标签: c

解决方案


你的编译器没有你聪明。您可能很清楚,函数永远不会以n小于 1 的方式调用,但编译器不会。我个人认为它被称为n典型0输入。

因此,它认为程序控制可以在没有显式返回的情况下到达函数右括号,如果你使用函数返回值},这正式是未定义的行为,重复一遍,我认为你这样做。

您收到此警告,编译器向您发出的问题提升为错误,因此编译停止。

一些修复:

  1. 用更强的 阻塞递归if (n <= 1){

  2. }在右大括号之前使用assert(false)或类似的运行时断言。

  3. 关闭将该警告提升为错误,但仍要处理该警告。


来自@JonathanLeffler 的一些建议

不要关闭 -Werror - 它太有价值了。处理警告。断言(n >= 0);在顶部; 如果 (n <= 1) { 返回 1; } 也是如此。断言在调试版本中触发;即使未启用断言,错误的参数值也可以合理安全地处理。


推荐阅读