繁体   English   中英

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

[英]Why is printf() an impure function?

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

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

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

换句话说,不管你有多少次调用它, 一个纯粹的功能会产生比其输出没有其他

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

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

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

printf是不纯的,因为它的结果有“副作用” - 特别是,它在屏幕上(或在文件中等)打印一些东西。
如果它是纯净的,那么你可以称之为十亿次,并确保没有任何不好的事情会发生。
但是如果你真的打电话给printf一百万次,那么用户肯定有所不同 - 它填满了他的屏幕(或磁盘空间,或其他)。 很明显,这不是纯粹的。

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM