副作用: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()
不是。
我正在学习副作用和纯函数。我知道纯函数没有副作用,并且它们的 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()
不是。