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

时间:2019-02-14 15:42:53

标签: c return return-value return-type

我对函数的返回类型有些困惑,特别是什么时候返回什么。如果我们有任意函数,比如说min(x,y),它应该根据if语句返回,那么在函数声明所要求的范围之外,我应该返回什么呢?我知道使用“ return 0”或“ return 1”是很常见的,但我不明白为什么会这样,为什么它不能只返回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;
}

4 个答案:

答案 0 :(得分:2)

  • 如果X大于Y,则返回X-Y (明显)
  • 如果Y大于X,则返回Y-X (也很明显)
  • 如果XY 等于 ,那么您认为应该返回什么?
    如果它们相等, X-YY-X都是0,所以这并不重要,对吗?

您的最终条款可以写成以下任何一种形式:

return x-y;
return y-x;
return 0; 

因为两个值相等,所以它们的所有值都将为0

重要的是要确保该函数的 contract
根据注释,该函数声称它将返回两个值之间的差。因此,无论较大的值是X,Y还是相等,它都应返回差值

函数的名称极具误导性。因为它被命名为min,这意味着它将返回 minimum 值,而不是差值。为了清楚起见,您应该将函数名称更改为diffdelta之类。


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

// 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);     }

答案 1 :(得分:1)

编译器需要确保您返回了某些内容。如果您在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可以捕获所有情况,所以编译器对此感到满意,并且不会引发任何错误。

答案 2 :(得分:0)

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

有一所编程学校说,最好在函数末尾有一个返回值,而不是分散在各处的多个返回值。无需在每个分支中返回差异,而是计算并存储该差异,然后在函数末尾将其返回:

int diff( int x, int y );
{
  int delta = 0;

  if ( x >= y )
    delta = x - y;
  else 
    delta = y - x;

  return delta;
}

像大多数编程规则一样,也有例外。在某些情况下,如果您不满足某些条件,则想要立即退出。知道哪种方法更好是一个经验问题。

答案 3 :(得分:-1)

函数的返回类型在定义中指定,int在您的情况下。 实际上,您需要指定输入参数的类型(x, y,然后通常从其类型派生输出的类型-例如函数中的2/3种情况,最后一个是整数({{1} }。

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