副作用:strcmp()是纯函数吗

时间:2019-07-26 08:23:20

标签: c functional-programming strcmp side-effects

我正在学习副作用纯功能。我知道纯函数没有副作用,并且对于相同的参数,它们的返回值相同。我想知道C函数strcmp()是否是纯函数。我相信它是纯净的,因为给定两个相同的字符串作为参数,结果将始终相同。此外,strcmp()不会修改任何变量或调用任何函数,因此没有任何副作用。

但是我不确定我的推理是否正确。

3 个答案:

答案 0 :(得分:3)

strcmp()是一个纯函数,因为结果仅取决于参数,此外,它不会修改全局状态。

当然,strcmp()的不当使用可能会引起不确定的行为,但这与它的纯净或不纯无关。

编辑:

当引用的全局内存也相同时,纯函数只会产生相同的结果。 不需要不需要的函数称为恒定函数

  

GCC文档提供strlen()作为纯函数的示例。实际上,此函数将指针作为参数,并对其进行访问以找到其长度。该函数读取全局内存(参数所指向的内存不视为参数),但不会对其进行更改,并且返回的值源自所访问的全局内存。

答案 1 :(得分:2)

strcmp()的行为与strlen()一样,仅取决于const char *参数所指向的内存内容。不会产生副作用,如果虚拟内存管理系统中的潜在更改被程序认为是不可见的,则可以将其视为 pure

但是请注意,密切相关的功能strcoll()可能会产生副作用,具体取决于语言环境处理的实现方式,因此不应视为纯函数。

类似地,isdigit()是纯净的,而isalpha()不是纯净的。

答案 2 :(得分:1)

从参数可变的意义上讲,这不是纯粹的。这意味着调用strcmp(a, b)的结果将取决于那些指针所指向的对象。返回值应该取决于参数的值。

纯函数的另一个要求是它没有副作用。这实现了。好吧,实际上是这样。这取决于您如何看待它。我几乎可以保证它的所有实现都没有副作用,但是标准本身并不要求它们没有副作用。

通常,您可以出于所有相关目的假定它没有副作用。唯一的例外是,如果调用调用了未定义的行为,则无论如何都应避免这种情况。

  

进一步的strcmp()不会修改任何变量或调用任何函数,因此它没有任何副作用。

您不能肯定地说它没有调用任何功能。这是实施细节。