2012-08-12 20 views
5

Hasta donde yo sé, las funciones impuras son aquellas que no siempre devuelven el mismo valor cuando se las llama con los mismos parámetros (me falta algo, o puede ser incorrecto, corríjanme si lo estoy).¿Por qué printf() es una función impura?

¿Por qué se considera que el printf() tiene una función impura?

Respuesta

15

No, una función "impura" es una función con efectos secundarios.

En otras palabras, no importa cuántas veces se lo llama, una función pura afectará nada aparte de su salida.

Por ejemplo, foo es impura, aunque retorno a cero:

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

Si foo eran puros, llamándolo no afectaría al resultado de bar().

printf es impuro porque su resultado tiene "efectos secundarios", específicamente, imprime algo en la pantalla (o en un archivo, etc.).
Si fuera puro, podría llamarlo mil millones de veces y estar seguro de que no pasaría nada malo.
Pero si realmente llama al printf un millón de veces, ciertamente es una diferencia para el usuario: llena su pantalla (o espacio en disco, o lo que sea). Entonces claramente no es puro.

Además: Si su salida fue redirigida para ser su propia entrada (algo inútil, pero aún así), entonces llamar a printf afectaría lo que recibiría de getchar. :) Así que es directamente observable de esa manera, también.

+3

Si bien es correcto, esta respuesta no tiene nada que ver con 'printf'. Tampoco aborda ** WHY ** 'printf' es impuro (externo, en lugar de efectos secundarios internos). –

+0

¿Todas las funciones son impuras? ¡Tienen tiempo de ejecutar (filosofía)! BTW - 'barra' regresa x –

+0

@DavidTitarenco: ¡Tienes razón, acabo de añadir eso, gracias! – Mehrdad

7

Hay dos partes para ser una función pura. El primero, como dijiste, es que la función debe devolver consistentemente el mismo valor para los mismos parámetros de entrada. El segundo criterio, que printf no cumple, es que la función no debe tener efectos secundarios como E/S o mutación de objeto.

+1

'printf' no cumple ni siquiera los primeros criterios: devuelve una cantidad de caracteres ** impresos con éxito **. – Vladimir

+0

@Vladimir: siempre que proporcione el mismo parámetro de entrada, siempre devolverá el mismo valor (que es el número de caracteres ** impresos con éxito **). Entonces, ¿cómo ** no ** cumple los primeros criterios? – cirronimbo

+0

El valor devuelto puede variar según a) la implementación de printf yb) los errores ocurrieron durante la escritura. Imagínese si stdout está cerrado. Aquí hay un ejemplo: http://pastebin.com/HAtCm2Jh – Vladimir

3

En pocas palabras, printf es impuro porque lo hace I/O. I/O por definición es impuro debido a la presencia de un estado externo del dispositivo I/O (estado que puede variar desde la ejecución hasta la ejecución).

0

printf() es impura porque provoca la salida de un dispositivo de E/S como un efecto secundario .....

1

La importancia de las funciones puras en la programación es que la aplicación puede optimizar a cabo una llamada de una función pura si ya tiene el resultado de una llamada de esa función con los mismos parámetros. Claramente, eso no se puede hacer para llamadas a printf.

P.S. Incluso según su definición, printf es impuro porque puede devolver un valor cuando tiene éxito y un valor diferente si hay un error de E/S, por ejemplo, falta de espacio en el dispositivo de salida.

0

Muchas de las respuestas explican que printf tiene E/S como efecto secundario, pero printf también puede tener otros efectos secundarios. Por ejemplo, el especificador %n permite printf a escriba en una dirección específica (y es la causa de algunas vulnerabilidades de seguridad).

Cuestiones relacionadas