C “如何修复”;错误:控件到达非无效函数“的末尾”;?

C “如何修复”;错误:控件到达非无效函数“的末尾”;?,c,C,如何修复编译器错误?您的编译器没有您聪明。您可能知道,如果n小于1,则永远不会调用该函数,但编译器不会。就我个人而言,对于典型的输入,我认为它被称为nas0 因此,它认为程序控制可以在没有显式返回的情况下到达函数closing brace},这在形式上是未定义的行为,如果您使用函数返回值,重复一下,我认为您是这样做的 编译器向您发出的此警告已提升为错误,因此编译将停止 一些修复: 如果(n你的编译器不如你聪明,用更强的阻止递归。你可能知道n小于1时调用函数,但编译器不会。我个人认为,对于典型输入


如何修复编译器错误?

您的编译器没有您聪明。您可能知道,如果
n
小于1,则永远不会调用该函数,但编译器不会。就我个人而言,对于典型的输入,我认为它被称为
n
as
0

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

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

一些修复:


  • 如果(n你的编译器不如你聪明,用更强的
    阻止递归。你可能知道
    n
    小于1时调用函数,但编译器不会。我个人认为,对于典型输入,它是用
    n
    as
    0
    调用的

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

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

    一些修复:


  • 用更强的
    if(n阻止递归,除了其他答案之外,这里还有另一个好技巧

    如果您完全确定您知道的比编译器多,并且没有返回的内容,那么将
    abort();
    作为函数的最后一行。编译器非常聪明,知道
    abort()
    将永远不会返回,因为它会导致程序崩溃。这将使警告静音


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

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

    如果您完全确定您知道的比编译器多,并且没有返回的内容,那么将
    abort();
    作为函数的最后一行。编译器非常聪明,知道
    abort()
    将永远不会返回,因为它会导致程序崩溃。这将使警告静音


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

    如果
    n
    小于1,函数将返回什么?不要说这不会发生。当
    n==2
    时,递归将执行
    爬升楼梯(0)
    爬升楼梯(1)
    。当
    n
    -123
    时会发生什么?假设
    n==0
    在这种情况下会返回什么?如果
    n
    小于1,函数会返回什么?不要说这不可能发生。当
    n==2
    时,递归会执行
    grampstairs(0)
    grampstairs(1)
    。当
    n
    -123
    时会发生什么?假设
    n==0
    在这种情况下返回什么?Afaics,对于任何
    n>1
    函数
    0)
    将在某个时候被调用。@Ctx:我同意。不要关闭
    -Werror
    -它太有价值了。处理警告。
    断言(n>=0);
    在顶部;
    如果(n避免
    n<0
    问题的另一种方法是使用
    无符号
    而不是
    int
    。你的编译器不如你聪明。我认为编译器在这种情况下更聪明。它知道你关于输入的假设可能是错误的,因为实际上,代码最终会被调用,而输入超出预期d range.Afaics,对于任何
    n>1
    ,函数
    grampstairs(0)
    将在某个点被调用。@Ctx:我同意。不要关闭
    -Werror
    -它太有价值了。处理警告。
    断言(n>=0);
    在顶部;
    如果(n避免
    n<0
    问题的另一种方法是使用
    无符号
    而不是
    int
    。你的编译器不如你聪明。我认为编译器在这种情况下更聪明。它知道你关于输入的假设可能是错误的,因为实际上,代码最终会被调用,而输入超出预期d范围。
    int climbStairs(int n ){
    
        if(n==1){
            return 1;
        }
        if (n>=2){
             return (2+ climbStairs(n-2)+ climbStairs(n-1));
        }
    }