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

Side-effects: Is strcmp() a pure function

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

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

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

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

编辑:

当引用的全局内存也相同时,纯函数只会产生相同的结果。 要求的函数称为常量函数

GCC documentation provides strlen() as an example of a pure function. Indeed, this function takes a pointer as a parameter, and accesses it to find its length. This function reads global memory (the memory pointed to by parameters is not considered a parameter), but does not change it, and the value returned derives from the global memory accessed.

它不是纯粹的,因为参数是可变的。这意味着调用 strcmp(a, b) 的结果将取决于这些指针指向的内容。 return 值应该 取决于参数的值。

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

一般来说,您可以出于所有相关目的假设它没有副作用。唯一的例外是调用调用未定义的行为,但无论如何您都应该避免这种情况。

Further strcmp() does not modify any variables or call any functions, thus it does not have any side effects.

你不能肯定地说它不调用任何函数。那是实现细节。

strcmp() 的行为与 strlen() 的行为类似,仅取决于 const char * 参数指向的内存内容。无意产生副作用,如果虚拟内存管理系统的潜在变化被认为对程序不可见,则可以认为是 pure.

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

同样 isdigit() 是纯粹的,但 isalpha() 不是。