繁体   English   中英

如何修复“错误:控制到达非空函数结束”?

[英]How to fix "error: control reaches end of non-void function"?

int climbStairs(int n ){

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

在此处输入图片说明

如何修复编译器错误?

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

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

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

一些修复:

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

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

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


来自@JonathanLeffler 的一些建议

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

除了这里的其他答案之外,还有一个很好的技巧。

如果你绝对确定你知道的比编译器多,而且没有什么可返回的,那么放一个abort(); 作为函数的最后一行。 编译器足够聪明,知道abort()永远不会返回,因为它会导致程序崩溃。 这将使警告静音。

请注意,程序崩溃是一件好事。 因为在这种情况下,当“不可能的事情”确实发生时,您会崩溃,并且如果您正在使用调试器,它将在您的调试器中弹出。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM