为什么printf()是一个不纯的函数?

时间:2012-08-12 05:14:07

标签: c printf purely-functional

据我所知,不正确的函数是那些在使用相同参数调用时并不总是返回相同值的函数(我必须遗漏某些东西,或者可能是错误的,如果我正确的话,请纠正我。)

那么为什么printf()被认为是不纯的函数呢?

6 个答案:

答案 0 :(得分:16)

不,“不纯”功能是具有副作用的功能

换句话说,无论你多少次调用它,一个纯函数会影响 no 而不是输出

例如, foo不纯即使它返回零

int x;
int foo() { x++; return 0; }
int bar() { return x; }

如果foo是纯粹的,则调用不会影响bar()的结果。

printf不纯,因为它的结果有“副作用” - 具体来说,它会在屏幕上(或文件中等)打印一些内容。
如果它是纯粹的,那么你可以称之为十亿次,并确保没有任何不好的事情发生 但是如果你实际上拨打了printf一百万次,那么肯定会与用户产生差异 - 它会填满他的屏幕(或磁盘空间,或其他任何东西)。很明显,这不是纯粹的。

此外:如果您的输出被重定向为您自己的输入(有些无用,但仍然如此),则调用printf会影响您从getchar收到的内容。 :)所以它也可以直接观察到。

答案 1 :(得分:7)

作为纯粹的功能有两个部分。首先,如您所述,该函数必须始终为相同的输入参数返回相同的值。 printf未实现的第二个标准是该函数不得具有I / O或对象变异等副作用。

答案 2 :(得分:3)

简单地说,printf是不纯的,因为它I/O。根据定义,I/O是不纯的,因为I/O设备的外部状态(状态可能因执行而异)。

答案 3 :(得分:1)

纯函数在编程中的重要性在于,如果已经具有使用相同参数调用该函数的结果,则实现可以优化纯函数的调用。显然,对于printf的调用无法做到。

P.S。即使按照你的定义,printf也是不纯的,因为它可以在成功时返回一个值,如果出现I / O错误则返回不同的值,例如,输出设备上的空间不足。

答案 4 :(得分:0)

printf()是不纯的,因为它会导致输出到I / O设备作为副作用.....

答案 5 :(得分:0)

很多答案都解释了printf有I / O作为副作用,但printf也有其他副作用。例如,%n说明符允许printf 写入指定的地址(并且是导致某些安全漏洞的原因)。