在Wikipedia文章https://en.wikipedia.org/wiki/Pure_function#Impure_functions中,它表示以下函数不是纯函数。
int f(int* x)
{
return *x;
}
那是为什么?该函数将为相同的参数返回相同的值,对吗?如果它是一个非可变的引用,是否将其视为纯文本,如下所示?
int f2(const int* x)
{
return *x;
}
答案 0 :(得分:4)
f
不是纯的,因为对于相同的参数,其返回值不必相同。您可以使用相同的输入两次调用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
在两个调用之间没有变化,因此如果f(x)
为f
,则可以优化对f
的第二个调用(有利于重用第一次调用的结果)纯。显然,这可能会产生错误的结果,因此f2
并不纯净。
{{1}}并非出于相同的原因。
答案 1 :(得分:2)
规则1说:
对于相同的自变量,其返回值相同(局部静态变量,非局部变量,可变参考变量或I / O设备的输入流无变化)。
关键是参数不是 x
所指向的值,而是指针的地址。您正在向函数传递地址。
由于可以更改指向的数据并传递相同的地址,因此您具有不同的返回值。
当然,如果f
或f2
返回了int*
而不是int
,那将不是真的。在这种情况下,相同的参数将导致相同的返回值。