错误:控件到达非void函数的结尾:(

时间:2017-07-05 15:11:05

标签: c recursion return

我知道之前有人问过,但我仍然找不到修复方法。程序应该使用递归对数字中的所有偶数进行求和。这是产生错误control reaches end of non-void function的代码:

#include<stdio.h>

int sum_even_d(unsigned long n);

int main()
{
    unsigned long n;
    int x;
    printf("Enter n : \n");
    scanf("%lu",&n);
    x=sum_even_d(n);
    printf("%d\n",x);
    return 0;

}

int sum_even_d(unsigned long n)
{
    if(n==0) return 0;
    if(n%2==0)
        return (sum_even_d(n/10)+n%10);//*error here*//
}

如果我添加一行,程序运行完美。我不明白是什么造成了不同:

#include<stdio.h>

int sum_even_d(unsigned long n);

int main()
{
    unsigned long n;
    int x;
    printf("Enter n : \n");
    scanf("%lu",&n);
    x=sum_even_d(n);
    printf("%d\n",x);
    return 0;

    }

int sum_even_d(unsigned long n)
{
    if(n==0) return 0;
    if(n%2==0)
        return (sum_even_d(n/10)+n%10);
    else return (sum_even_d(n/10));//*added this*//
}

3 个答案:

答案 0 :(得分:1)

在第一个例子中,任何奇数都会导致程序在没有return的情况下从函数的底部掉下来。声明的类型int需要返回值。当您添加带有返回值的else子句时,您使用值覆盖了剩余的大小写。

答案 1 :(得分:1)

n为奇数的第一个代码段中,函数sum_even_d无法达到任何return语句。但由于函数定义为非void,因此必须返回一个值。这就是编译器告诉你的。在第二个代码段中,您的else语句正在处理此代码路径。

答案 2 :(得分:0)

没有返回类型void 的函数的所有可能路径都必须返回一个值。

在第一段代码中,如果条件if(n%2==0)为false,则代码将运行到函数末尾但未返回值。回到调用函数,返回值是未知的,因为您没有指定一个。这引发了未定义的行为。

您的第二个代码确实为所有路径返回一个值,因此没有错误。