首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么C让您忽略函数返回的值?

为什么C让您忽略函数返回的值?
EN

Stack Overflow用户
提问于 2022-04-16 01:25:23
回答 3查看 103关注 0票数 1

假设我有以下C代码:

代码语言:javascript
运行
复制
int return_one()
{
    return 1;
}

int main(void)
{
    return_one();
}

在主函数中,我调用函数return_one()并忽略返回值。编译器不介意我忽略这个值。

为什么这样好呢?这是C创建者的任意设计选择吗?或者,是否有实际原因不要求调用函数使用返回值?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-04-16 02:04:52

我认为最主要的原因是通常的一段历史。

在C标准之前,没有使用void表示“无返回值”的选项。函数返回一个int,除非您指定它们返回其他类型,但另一个类型不能是void (它不存在)。因此,返回值不重要的函数不返回值--即使函数隐式地返回类型int。(通常省略返回类型--函数是隐式返回int。)如果调用代码试图使用值,但被调用的函数没有返回值,则得到UB。

所有这些都意味着忽略函数的返回值是司空见惯的事情--特别是名义上返回int但实际上没有返回任何值的函数。没有比这更好的处理方法了。现在,对于void返回类型,有更好的方法来处理它。然而,回报价值往往是有限的,这仍然是事实。您多久检查一次printf()或它的一个朋友的返回值?您多久使用一次strcpy()等的返回值?

C90必须允许旧代码继续运行,所以它允许旧的、预先标准的行为。C99收紧了规则--函数不再隐式地属于int类型,必须声明(使用显式的返回类型,可能是void)才能使用它们。

票数 3
EN

Stack Overflow用户

发布于 2022-04-16 01:35:04

因为人们不关心很多返回值,所以为什么强迫他们使用这些值呢?

大量的标准C函数返回的值本质上是从未见过的。想想你看过的所有C代码。您是否见过有人使用printf系列函数的返回值进行任何操作?因为他们都有一个,但是你永远不会知道去看现实世界的代码。如果每个对printf的调用都必须在它的前缀加上一个显式的"I‘t but to the返回值“的语法(例如(void)),那么它会得到改进吗?因为99.99%的情况下,您实际上并不关心打印了多少字节,但是printf无论如何都计算和返回它?基本上,您可以不使用返回值,因为没有必要强迫您这样做,而且通常不需要这样做。

票数 3
EN

Stack Overflow用户

发布于 2022-04-16 01:44:09

tl;dr:您可以编写代码,这样返回值总是相关的--在这种情况下,忽略它们将是一个错误。但是,一些(特别是较旧的)代码不能这样工作,忽略返回值可能是合理的。

为什么这样好呢?这是C创建者的任意设计选择吗?

它不仅仅是C创建者的一种选择,许多其他语言也允许这样做--事实上,我想不出一种忽略返回值被认为是错误的语言。

这样做的实际动机主要是函数的返回值通常用于报告错误,或报告函数所做的细节。有时候,你对这些细节不感兴趣,所以你会忽略它们。这方面的一个常见示例是C函数printf,它返回打印的字符数。虽然这有时可能有用,但通常不是,因此printf的返回值通常被忽略。

这可以说是一个糟糕的设计(无论是在您的代码中,还是在返回没有人想要的东西的函数中),但是它是既定的实践,所以C(和其他语言一样)支持这一点。

或者,是否有实际原因不要求调用函数使用返回值?

不,忽略返回值没有实际的理由--除非您不想要它们。

虽然以上是历史实践,但许多人现在认为忽略返回值是一个问题(或更深层次问题的症状):

  • 如果返回值用于错误报告,忽略它通常会正常工作,但如果确实存在错误,则会导致问题。这现在通常被认为是个坏主意。
  • 通常,如果您可以忽略返回值,这意味着函数会产生副作用(否则调用它就没有意义了)。许多人认为让函数只做一件事更好--要么导致副作用(而什么也不返回),要么返回值(并且没有副作用)。后者通常被称为纯函数 (输出的附加条件仅取决于输入)。这种分离使软件更容易理解--如果使用它,忽略返回值必然是一个错误,因为返回结果的函数不会做任何其他事情,所以如果忽略结果,调用它就没有意义。

因此,换句话说:如果您遵循某些约定,不应该存在忽略返回值的情况,在这种情况下,忽略它们通常是一个错误。如果没有这些约定,就有很好的理由忽略它们,所以没有一般的规则。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71890345

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档