哪一个是正确的 Return 值类型?

Which one is correct Return value type?

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

但是我知识匮乏,不知道哪个是对的

哪个是正确的?

program #1 - return 值类型: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 - return 值类型: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);
}

第一个正确,第二个错误。在第二个中,即使函数类型是 int,你也不会 return 任何东西。你应该 return 一个整数。例如,

int func() {//Whatever code}

错了。它需要 return 和 int。正确的版本是:

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

如果您不想return任何东西,那么您需要使用 void 类型。

void func() {
    return 0;
}

这是错误的。你不能return任何事情,你需要做:

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。它只发生在主函数中。

没有。 3 完全正确。

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

总的来说,我更喜欢简单的数学函数(如阶乘)而不是 return 直接值(在本例中为 int);为此,我会像这样编写 calculateFactorial 函数:

int calculateFactorial(int num)
{
    if (num <= 1) return 1;
    return num * calculateFactorial(num - 1);
}
在这种情况下不需要

sum,只需打印 returned 值(从技术上讲,这是一个乘积,而不是总和)。