首页 > 解决方案 > 为什么这个函数不纯?

问题描述

在维基百科文章https://en.wikipedia.org/wiki/Pure_function#Impure_functions中它说以下函数不是纯函数。

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

这是为什么?该函数将为相同的参数返回相同的值,对吗?如果它是一个不可变的引用,它是否会被认为是纯的,如下所示?

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

标签: cfunctionlanguage-agnostic

解决方案


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出于同样的原因,它并不纯粹。


推荐阅读