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