C 函数什么时候应该返回什么?

C 函数什么时候应该返回什么?,c,return,return-value,return-type,C,Return,Return Value,Return Type,我对函数的返回类型有点困惑,特别是何时返回什么。如果我们有任意函数,比如min(x,y),它应该根据If语句返回,我应该在它们的范围之外返回什么,这是函数声明所要求的。我了解到使用“return0”或“return1”是很常见的,但我不明白为什么会这样,为什么它不能只返回if的return语句 // compute difference largest - smallest int diff(x, y) { if (x > y) return x - y; if (

我对函数的返回类型有点困惑,特别是何时返回什么。如果我们有任意函数,比如min(x,y),它应该根据If语句返回,我应该在它们的范围之外返回什么,这是函数声明所要求的。我了解到使用“return0”或“return1”是很常见的,但我不明白为什么会这样,为什么它不能只返回if的return语句

// compute difference largest - smallest
int   diff(x, y)
{
   if (x > y)
    return x - y;
   if (y > x)
    return y - x;
   if (x == y)
    return 0;
   return 1;
}
  • 如果
    X
    大于
    Y
    ,则返回
    X-Y
    (明显)
  • 如果
    Y
    大于
    X
    ,则返回
    Y-X
    (同样明显)
  • 如果
    X
    Y
    相等,您认为应该返回什么?
    如果它们相等,那么
    X-Y
    Y-X
    都是
    0
    ,所以这并不重要,不是吗
您的最终条款可以写成以下任何一项:

return x-y;
return y-x;
return 0; 
因为这两个值相等,所以它们的计算结果都是
0

重要的一点是确保函数的契约得到维护。
根据注释,函数声称它将返回两个值之间的差值。因此,无论较大的值是X、Y还是它们相等,它在所有情况下都应返回差值

你函数的名字非常容易误导人。因为它被命名为
min
,这意味着它将返回最小值,而不是差值。为了清晰起见,您应该将函数的名称更改为类似于
diff
delta


最终,编写函数的更简单方法是:

// compute largest - smallest
int diff(int x, int y)
{
   if (x > y)
    return x - y;   // Handles X is bigger than Y
   else
    return y - x;   // Handles Y bigger than X, *or* X and Y are the same.
}

最后,我会考虑一些很短的版本。

int diff(int x, int y) { return x>y? x-y:y-x; }
int diff(int x, int y) { return abs(x-y);     }
  • 如果
    X
    大于
    Y
    ,则返回
    X-Y
    (明显)
  • 如果
    Y
    大于
    X
    ,则返回
    Y-X
    (同样明显)
  • 如果
    X
    Y
    相等,您认为应该返回什么?
    如果它们相等,那么
    X-Y
    Y-X
    都是
    0
    ,所以这并不重要,不是吗
您的最终条款可以写成以下任何一项:

return x-y;
return y-x;
return 0; 
因为这两个值相等,所以它们的计算结果都是
0

重要的一点是确保函数的契约得到维护。
根据注释,函数声称它将返回两个值之间的差值。因此,无论较大的值是X、Y还是它们相等,它在所有情况下都应返回差值

你函数的名字非常容易误导人。因为它被命名为
min
,这意味着它将返回最小值,而不是差值。为了清晰起见,您应该将函数的名称更改为类似于
diff
delta


最终,编写函数的更简单方法是:

// compute largest - smallest
int diff(int x, int y)
{
   if (x > y)
    return x - y;   // Handles X is bigger than Y
   else
    return y - x;   // Handles Y bigger than X, *or* X and Y are the same.
}

最后,我会考虑一些很短的版本。

int diff(int x, int y) { return x>y? x-y:y-x; }
int diff(int x, int y) { return abs(x-y);     }

函数的返回类型在定义中指定,在您的案例中为
int
。 实际上,您需要指定输入参数的类型(
x,y
),然后输出的类型通常是从函数中的2/3类型派生出来的,最后一个是整数(
0

备注:
您还需要为函数选择更好的名称。

函数的返回类型在您的案例中的定义
int
中指定。 实际上,您需要指定输入参数的类型(
x,y
),然后输出的类型通常是从函数中的2/3类型派生出来的,最后一个是整数(
0

备注:
您还需要为函数选择更好的名称。

编译器需要确保您返回一些内容。如果在If语句中有返回,例如,编译器将如何判断您是否涵盖了所有情况

即使您执行下面的代码,编译器如何知道您将在所有情况下返回?因此,此代码将抛出一个错误:

int min(int x, int y)
{
    if (x > y)
        return x - y;
    if (y > x)
        return y - x;
    if (x==y)
        return 1;
}
你怎么能对付这个?您可以在函数末尾编写另一个返回,正如您所做的那样。现在编译器知道,无论发生什么情况,您都将返回一个值

但是,有更好的方法确保始终返回值。例如,您可以使用else语句作为“全面覆盖”:

int min(int x, int y)
{
    if (x > y)
        return x - y;
    if (y > x)
        return y - x;
    else
        return 1;
}

因为else保证捕获所有情况,所以编译器对此感到满意,并且不会抛出任何错误

编译器需要确保您返回了一些内容。如果在If语句中有返回,例如,编译器将如何判断您是否涵盖了所有情况

即使您执行下面的代码,编译器如何知道您将在所有情况下返回?因此,此代码将抛出一个错误:

int min(int x, int y)
{
    if (x > y)
        return x - y;
    if (y > x)
        return y - x;
    if (x==y)
        return 1;
}
你怎么能对付这个?您可以在函数末尾编写另一个返回,正如您所做的那样。现在编译器知道,无论发生什么情况,您都将返回一个值

但是,有更好的方法确保始终返回值。例如,您可以使用else语句作为“全面覆盖”:

int min(int x, int y)
{
    if (x > y)
        return x - y;
    if (y > x)
        return y - x;
    else
        return 1;
}

因为else保证捕获所有情况,所以编译器对此感到满意,并且不会抛出任何错误

对于计算两个值之差的函数,如果两个值之差为1,则只返回1;如果两个值相等,则返回0

有一个编程学派说,最好在函数的末尾有一个单一的返回,而不是分散在函数中的多个返回。不要返回每个分支中的差异,而是计算并存储该差异,并在o末尾返回它