为什么这个函数不纯粹?
Why is this function not pure?
在维基百科的文章https://en.wikipedia.org/wiki/Pure_function#Impure_functions中说下面的函数不是纯函数。
int f(int* x)
{
return *x;
}
这是为什么?该函数将 return 相同参数的相同值对吗?如果它是一个非可变引用,是否会被认为是纯引用,如下所示?
int f2(const int* x)
{
return *x;
}
f
不是纯的,因为对于相同的参数,它的 return 值不一定相同。您可以使用相同的输入两次调用 f
并获得不同的输出。以下程序对此进行了演示:
#include <stdio.h>
int main() {
int i = 3;
int * const x = &i;
printf("%d\n", f(x));
i = 4;
printf("%d\n", f(x));
return 0;
}
因为 x
在两次调用之间没有变化,如果 [=11= 】 很纯粹。显然,这可能会产生错误的结果,因此 f
不是纯的。
f2
出于同样的原因并不纯粹。
规则 1 说:
Its return value is the same for the same arguments (no variation with local static variables, non-local variables, mutable reference arguments or input streams from I/O devices).
重点是参数不是x
指向的值,而是指针的地址。您正在将地址传递给函数。
由于您可以更改指向的数据并传递相同的地址,因此您有不同的 return 值。
当然,如果 f
或 f2
return 是 int*
而不是 int
,这就不是真的了。在那种情况下,相同的参数将导致相同的 return 值。
在维基百科的文章https://en.wikipedia.org/wiki/Pure_function#Impure_functions中说下面的函数不是纯函数。
int f(int* x)
{
return *x;
}
这是为什么?该函数将 return 相同参数的相同值对吗?如果它是一个非可变引用,是否会被认为是纯引用,如下所示?
int f2(const int* x)
{
return *x;
}
f
不是纯的,因为对于相同的参数,它的 return 值不一定相同。您可以使用相同的输入两次调用 f
并获得不同的输出。以下程序对此进行了演示:
#include <stdio.h>
int main() {
int i = 3;
int * const x = &i;
printf("%d\n", f(x));
i = 4;
printf("%d\n", f(x));
return 0;
}
因为 x
在两次调用之间没有变化,如果 [=11= 】 很纯粹。显然,这可能会产生错误的结果,因此 f
不是纯的。
f2
出于同样的原因并不纯粹。
规则 1 说:
Its return value is the same for the same arguments (no variation with local static variables, non-local variables, mutable reference arguments or input streams from I/O devices).
重点是参数不是x
指向的值,而是指针的地址。您正在将地址传递给函数。
由于您可以更改指向的数据并传递相同的地址,因此您有不同的 return 值。
当然,如果 f
或 f2
return 是 int*
而不是 int
,这就不是真的了。在那种情况下,相同的参数将导致相同的 return 值。