我对函数的返回类型有些困惑,特别是什么时候返回什么。如果我们有任意函数,比如说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;
}
答案 0 :(得分:2)
X
大于Y
,则返回X-Y
(明显) Y
大于X
,则返回Y-X
(也很明显) X
和Y
是 等于 ,那么您认为应该返回什么?X-Y
和Y-X
都是0
,所以这并不重要,对吗?您的最终条款可以写成以下任何一种形式:
return x-y;
return y-x;
return 0;
因为两个值相等,所以它们的所有值都将为0
。
重要的是要确保该函数的 contract 。
根据注释,该函数声称它将返回两个值之间的差。因此,无论较大的值是X,Y还是相等,它都应返回差值 。
函数的名称极具误导性。因为它被命名为min
,这意味着它将返回 minimum 值,而不是差值。为了清楚起见,您应该将函数名称更改为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); }
答案 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} }。
备注: 您还需要为函数选择更好的名称。