[英]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.