我知道之前有人问过,但我仍然找不到修复方法。程序应该使用递归对数字中的所有偶数进行求和。这是产生错误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*//
}
答案 0 :(得分:1)
在第一个例子中,任何奇数都会导致程序在没有return
的情况下从函数的底部掉下来。声明的类型int
需要返回值。当您添加带有返回值的else
子句时,您使用值覆盖了剩余的大小写。
答案 1 :(得分:1)
在n
为奇数的第一个代码段中,函数sum_even_d
无法达到任何return
语句。但由于函数定义为非void,因此必须返回一个值。这就是编译器告诉你的。在第二个代码段中,您的else
语句正在处理此代码路径。
答案 2 :(得分:0)
没有返回类型void
的函数的所有可能路径都必须返回一个值。
在第一段代码中,如果条件if(n%2==0)
为false,则代码将运行到函数末尾但未返回值。回到调用函数,返回值是未知的,因为您没有指定一个。这引发了未定义的行为。
您的第二个代码确实为所有路径返回一个值,因此没有错误。