【问题标题】:error: control reaches end of non-void function:( [duplicate]错误:控制到达非无效函数的结尾:([重复]
【发布时间】:2017-12-09 08:19:00
【问题描述】:

我知道以前有人问过这个问题,但我仍然找不到解决方法。该程序应该使用递归对数字中的所有偶数求和。这是产生错误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*//
}

【问题讨论】:

  • 如果您没有从声明为返回某些内容的函数中返回任何内容,那么您将有未定义的行为
  • n%2==1时返回值未确定。
  • n=3时你想让函数做什么
  • 复制品是C++没关系;在任何其他类似的编程语言中都是一样的

标签: c recursion return


【解决方案1】:

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

【讨论】:

  • 知道了。非常感谢大家!
  • 负奇数也一样,为什么要指定
  • 好点...修复...
【解决方案2】:

n 为奇数的第一个sn-p 中,函数sum_even_d 不会到达任何return 语句。但由于该函数被定义为非 void,它必须返回一个值。这就是编译器告诉你的。在第二个 sn-p 中,您的 else 语句负责处理此代码路径。

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-07
      • 1970-01-01
      • 1970-01-01
      • 2022-01-25
      相关资源
      最近更新 更多