为什么这个功能不纯?

时间:2019-07-06 17:43:56

标签: c function language-agnostic

在Wikipedia文章https://en.wikipedia.org/wiki/Pure_function#Impure_functions中,它表示以下函数不是纯函数。

int f(int* x) 
{
    return *x;
}

那是为什么?该函数将为相同的参数返回相同的值,对吗?如果它是一个非可变的引用,是否将其视为纯文本,如下所示?

int f2(const int* x) 
{
    return *x;
}

2 个答案:

答案 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所指向的值,而是指针的地址。您正在向函数传递地址。

由于可以更改指向的数据并传递相同的地址,因此您具有不同的返回值。

当然,如果ff2返回了int*而不是int,那将不是真的。在这种情况下,相同的参数将导致相同的返回值。