【问题标题】:Which one is correct Return value type?哪一个是正确的返回值类型?
【发布时间】:2021-05-15 14:54:01
【问题描述】:

我正在编写两个计算阶乘的程序。 program #1 的返回值类型为 void,program #2 的返回值类型为 int。

但我缺乏知识,所以我不知道哪个是对的。

哪个是正确的?

program #1 - 返回值类型:void

#include <stdio.h>

void calculateFactorial(int count, int *sum);

int main()
{
    int number;
    int sum = 1;
    
    printf("factorial number: ");
    scanf(" %d", &number);
    
    calculateFactorial(number, &sum);
    
    printf("result: %d\n", sum);
    
    return 0;
}

void calculateFactorial(int count, int *sum)
{
    if (count == 0)
    {
        return;
    }
    
    *sum *= count;

    calculateFactorial(--count, sum);
}

program #2 - 返回值类型:int

#include <stdio.h>

int calculateFactorial(int count, int *sum);

int main()
{
    int number;
    int sum = 1;
    
    printf("factorial number: ");
    scanf(" %d", &number);
    
    calculateFactorial(number, &sum);
    
    printf("result: %d\n", sum);
    
    return 0;
}

int calculateFactorial(int count, int *sum)
{
    if (count == 0)
    {
        return *sum;
    }
    
    *sum *= count;

    calculateFactorial(--count, sum);
}

【问题讨论】:

  • 第二个是错误的,因为你不返回任何值,所以函数必须有 void 返回类型。您的编译器一定发出了一些警告。
  • @anastaciu 谢谢。我有一个问题,这不是递归函数吗?因此,为了转义递归函数,我尝试通过创建单独的条件语句而不在函数末尾返回来返回它。即便如此,是否确定没有返回值?
  • 첫 번째는 꼬리 재귀 함수이고, 두 번째는 일반적인 재귀 함수이다。 재귀함수는가독성을을주지만,스택에데이터를쌓기쌓기에에스택오버플로우해야해야해야해야해야해야해야해야해야해야해야해야해야때문때문때문에에해야해야해야해야 꼬래 재귀 함수란, 재귀 함수의 가독성은 그대로 유지하되 단점을 보완한 재귀 함수이다。 이때, 컴파일러가 꼬리 재귀 최적화 기능을 제공해야만 하며, 그렇지 않다면 둘 다 별로이다。
  • 它是一个递归函数,如果你在最后添加一个条件语句,很可能不是所有的路径都返回一个值。递归函数可以有void的返回类型,你还有停止条件,缺少的返回会由函数自动完成,是IMO的最佳选择。

标签: c c99


【解决方案1】:

第一个是正确的,第二个是错误的。在第二个中,即使函数类型是 int,您也不会返回任何内容。你应该返回一个int。例如,

int func() {//Whatever code}

错了。它需要返回一个int。正确的版本是:

int func() {
     return 0; //Or whatever int
}

如果你不想返回任何东西,那么你需要有 void 类型。

void func() {
    return 0;
}

这是错误的。你不能退货,你需要做:

void func {
    return; //Not having a return won't do anything though, you can leave it blank
}

void func {} //Works, no need to return

您可能会感到困惑,因为:

1. void main() {} //Works and
2. int main() {} //Works as well, and
3. int main() {return 0;} //Works as well

所以,没有 1. 绝对是垃圾。它以某种方式起作用,但它是错误的并且是垃圾。检查How does int main() and void main() work?

在没有。 2 编译器会为你添加return 0。它只发生在 main 函数中。

没有。 3 完全正确。

【讨论】:

    【解决方案2】:

    在处理函数返回值的方式上没有对错之分:它们可以作为直接值返回,也可以通过传递的指针作为辅助值返回。然而,每一种方法都有一种(或多种)正确的方法,也有许多错误的方法。在您的两个示例中,第一个以正确的方式完成,第二个以错误的方式完成。在第二个例子中,count != 0 的情况没有返回,所以是错误的方式。

    我一般来说,我更喜欢一个简单的数学函数(如阶乘)来返回一个直接值(在这种情况下,作为一个 int);为此,我会像这样编写calculateFactorial 函数:

    int calculateFactorial(int num)
    {
        if (num <= 1) return 1;
        return num * calculateFactorial(num - 1);
    }
    

    在这种情况下不需要sum,只需打印返回值(从技术上讲,这是一个产品,而不是一个总和)。

    【讨论】:

      猜你喜欢
      • 2022-01-24
      • 1970-01-01
      • 2012-04-22
      • 2021-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-03
      • 1970-01-01
      相关资源
      最近更新 更多