English 中文(简体)
为什么 C 允许您忽略函数返回的值?
原标题:Why does C let you ignore returned values from functions?
  • 时间:2022-04-16 01:25:23
  •  标签:
  • c
  • function

假设我有以下C代码:

int return_one()
{
    return 1;
}

int main(void)
{
    return_one();
}

在主函数中, 我调用函数 return_one () , 忽略返回值。 编译器与我忽略此值没有冲突 。

为什么这样可以? 这是C创造者的任意设计选择吗? 还是有实际理由不要求调用功能使用回报值?

最佳回答

我认为,主要原因就是通常的原因——历史。

在 C 标准之前, 无法选择使用 < code> evue 来表示任何返回值。 函数返回了一个 < code> int , 除非您指定他们返回了其他类型, 但其他类型不能返回 < code> lese (它不存在)。 因此, 返回值不重要的函数没有返回一个值, 即使函数是隐含返回类型 < code> int 。 (Usually, 返回类型被省略了 - 函数是默认返回了 < code> int 。) 如果调用代码试图使用值但调用函数没有返回一个值, 您得到了 UB 。

这意味着忽略函数的返回值是常见的, 特别是名义上返回一个 int , 但实际上没有返回任何值的函数。 没有更好的处理方法。 如今, 有了 < code> 省去 返回类型, 仍然有更好的处理方法。 尽管如此, 返回值往往利息有限, 仍然是事实。 您多久检查一次 < code> printf () 或其朋友之一的返回值? 您使用 strcpy () et al 的返回值的频率?

C90不得不允许旧代码运行不变,从而允许旧的、标准前的行为。C99收紧了规则——功能不再隐含类型为 int ,在使用之前必须申报(明确返回类型,可能为 省略 )。

问题回答

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

标准 C 函数返回值的 < em> ton < / em > 函数返回值本质上是 < em> never < / em > 。 想想您曾经查看过的所有 C 代码。 您是否见过有人从 < code> printf < / code > 函数组中找到返回值 < em> < ton ? 因为他们都有一个函数, 但是您不知道它会查看真实世界代码。 如果每次调用 < code > printf 都用明确的“ 我不管 返回值” 语句( 例如 < code> (ness) ) ) 字句( ) 字元值来预设它。 因为99.99%的时间, 您实际上不关心您打印多少字节, 但是 < code> print 计算并返回它吗 。 基本上, 您允许不使用返回返回返回值是否允许, 因为不需要这样做, 而且它通常不需要 。

< strong> tl; dr : 您可以写入代码, 这样返回值总是相关的 - 如果忽略返回值将是一个错误。 但是, 有些( 特别是旧的) 代码不起作用, 忽略返回值可能是合理的 。

What is the logic as to why this okay? Was it an arbitrary design choice from the C creators?

这不仅仅是C创造者的选择, 许多其他语言也允许这样做, 事实上,

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

这可以说是一个糟糕的设计(在您的代码中,或者在函数中,它返回无人想要的东西),但它是既定的做法,所以C(与其他语言一样)支持这一设计。

还是有实际理由不要求调用函数使用返回值?

不,没有实际理由忽略返回价值,除非你不想返回价值。


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

  • If the return value is for error reporting, ignoring it will work usually, but cause problems if there really is an error. This is now usually considered a bad idea.
  • Generally, if you can ignore the return value, that means the function is causing side-effects (otherwise calling it would be pointless). Many people think that it is better to have functions only do one thing - either cause a side effect (and return nothing), or return a value (and have no side effects). The latter is often called a pure function (with the additional condition of the output only depending on the input). This separation makes it easier to understand software - and if you use it, ignoring a return value is necessarily a mistake, because functions returning a result do nothing else, so if you ignore the result, calling it is pointless.

换句话说:如果你遵循某些公约,那么就不应该出现你想忽略返回价值的情况,在这种情况下,忽略这些价值通常是个错误。 没有这些公约,就可能有很好的理由忽视它们,所以没有一般规则。

事实上,我在研究我是否可以忽略一个函数的返回价值时, 却碰巧碰上这个文章, 如果可以的话, 如何设置它。 以下是原因:

我在SPI通讯中工作。 主人需要向奴隶发送命令。 它需要将命令保存在登记簿中, 并准备发送。 主人这样做的方式是启动同样的事件序列, 除非我们不需要在登记簿中放置任何具体数据, 除非我们这次不需要在登记簿中放置任何具体数据。 时钟脉冲有几次, 完成后, 主登记册的内容现在就在奴隶登记册中, 奴隶可以阅读它们, 并解释/ 执行命令 。 但是, 奴隶登记册中过去的内容现在都在主登记册中 。 我并不关心奴隶寄给我什么, 它很可能是垃圾, 因为我甚至还没有告诉它要做什么。 (我刚刚这样做过, 但是它不可能在它刚刚发送的数据中执行)

所以,我发送的命令实际上是要求读取来自奴隶中特定记忆地址的一些数据。 奴隶解释命令, 获取有关数据, 并保存在登记册中, 等待主人启动转移。 然后钟脉冲几次, 登记册又换了一次 。 这次, 我关心什么回来了 。

所以我有两个选项:要么写两个函数, 做同样的事情, 除了一个函数返回登记册中的最后值, 而另一个函数忽略它。 或者我可以写一个相同的函数, 忽略向上返回的值 。

在嵌入的世界里,有很多决定 感觉是任意的, 但我敢打赌,所有这些决定 在某个时候都服务于一个非常具体的目的。而且很多决定仍然在做。





相关问题
Fastest method for running a binary search on a file in C?

For example, let s say I want to find a particular word or number in a file. The contents are in sorted order (obviously). Since I want to run a binary search on the file, it seems like a real waste ...

Print possible strings created from a Number

Given a 10 digit Telephone Number, we have to print all possible strings created from that. The mapping of the numbers is the one as exactly on a phone s keypad. i.e. for 1,0-> No Letter for 2->...

Tips for debugging a made-for-linux application on windows?

I m trying to find the source of a bug I have found in an open-source application. I have managed to get a build up and running on my Windows machine, but I m having trouble finding the spot in the ...

Trying to split by two delimiters and it doesn t work - C

I wrote below code to readin line by line from stdin ex. city=Boston;city=New York;city=Chicago and then split each line by ; delimiter and print each record. Then in yet another loop I try to ...

Good, free, easy-to-use C graphics libraries? [closed]

I was wondering if there were any good free graphics libraries for C that are easy to use? It s for plotting 2d and 3d graphs and then saving to a file. It s on a Linux system and there s no gnuplot ...

Encoding, decoding an integer to a char array

Please note that this is not homework and i did search before starting this new thread. I got Store an int in a char array? I was looking for an answer but didn t get any satisfactory answer in the ...