假设我有以下C代码:
int return_one()
{
return 1;
}
int main(void)
{
return_one();
}
在主函数中,我调用函数return_one()
并忽略返回值。编译器不介意我忽略这个值。
为什么这样好呢?这是C创建者的任意设计选择吗?或者,是否有实际原因不要求调用函数使用返回值?
发布于 2022-04-16 02:04:52
我认为最主要的原因是通常的一段历史。
在C标准之前,没有使用void
表示“无返回值”的选项。函数返回一个int
,除非您指定它们返回其他类型,但另一个类型不能是void
(它不存在)。因此,返回值不重要的函数不返回值--即使函数隐式地返回类型int
。(通常省略返回类型--函数是隐式返回int
。)如果调用代码试图使用值,但被调用的函数没有返回值,则得到UB。
所有这些都意味着忽略函数的返回值是司空见惯的事情--特别是名义上返回int
但实际上没有返回任何值的函数。没有比这更好的处理方法了。现在,对于void
返回类型,有更好的方法来处理它。然而,回报价值往往是有限的,这仍然是事实。您多久检查一次printf()
或它的一个朋友的返回值?您多久使用一次strcpy()
等的返回值?
C90必须允许旧代码继续运行,所以它允许旧的、预先标准的行为。C99收紧了规则--函数不再隐式地属于int
类型,必须声明(使用显式的返回类型,可能是void
)才能使用它们。
发布于 2022-04-16 01:35:04
因为人们不关心很多返回值,所以为什么强迫他们使用这些值呢?
大量的标准C函数返回的值本质上是从未见过的。想想你看过的所有C代码。您是否见过有人使用printf
系列函数的返回值进行任何操作?因为他们都有一个,但是你永远不会知道去看现实世界的代码。如果每个对printf
的调用都必须在它的前缀加上一个显式的"I‘t but to the返回值“的语法(例如(void)
),那么它会得到改进吗?因为99.99%的情况下,您实际上并不关心打印了多少字节,但是printf
无论如何都计算和返回它?基本上,您可以不使用返回值,因为没有必要强迫您这样做,而且通常不需要这样做。
发布于 2022-04-16 01:44:09
tl;dr:您可以编写代码,这样返回值总是相关的--在这种情况下,忽略它们将是一个错误。但是,一些(特别是较旧的)代码不能这样工作,忽略返回值可能是合理的。
为什么这样好呢?这是C创建者的任意设计选择吗?
它不仅仅是C创建者的一种选择,许多其他语言也允许这样做--事实上,我想不出一种忽略返回值被认为是错误的语言。
这样做的实际动机主要是函数的返回值通常用于报告错误,或报告函数所做的细节。有时候,你对这些细节不感兴趣,所以你会忽略它们。这方面的一个常见示例是C函数printf
,它返回打印的字符数。虽然这有时可能有用,但通常不是,因此printf
的返回值通常被忽略。
这可以说是一个糟糕的设计(无论是在您的代码中,还是在返回没有人想要的东西的函数中),但是它是既定的实践,所以C(和其他语言一样)支持这一点。
或者,是否有实际原因不要求调用函数使用返回值?
不,忽略返回值没有实际的理由--除非您不想要它们。
虽然以上是历史实践,但许多人现在认为忽略返回值是一个问题(或更深层次问题的症状):
因此,换句话说:如果您遵循某些约定,不应该存在忽略返回值的情况,在这种情况下,忽略它们通常是一个错误。如果没有这些约定,就有很好的理由忽略它们,所以没有一般的规则。
https://stackoverflow.com/questions/71890345
复制相似问题