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