2012-08-12 6 views
5

Soweit ich weiß, sind unreine Funktionen diejenigen, die nicht immer den gleichen Wert zurückgeben, wenn sie mit denselben Parametern aufgerufen werden (ich muss etwas verpassen oder falsch sein, korrigiere mich, wenn ich es bin).Warum ist printf() eine unreine Funktion?

Warum wird printf() als unreine Funktion betrachtet?

Antwort

15

Nein, eine "unreine" Funktion ist eine Funktion mit Nebenwirkungen.

Mit anderen Worten, egal wie oft Sie es nennen, eine reine Funktion beeinflussen nichts anderen als seinen Ausgang.

Zum Beispiel foo ist unrein, obwohl sie zurückkehren Null:

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

Wenn foo rein waren, nannte es nicht das Ergebnis bar() beeinflussen.

printf ist unrein, weil sein Ergebnis "Nebenwirkungen" hat - speziell druckt es etwas auf dem Bildschirm (oder in einer Datei, etc).
Wenn es rein wäre, dann könnten Sie es eine Milliarde Mal nennen und sicher sein, dass nichts Schlimmes passieren würde.
Aber wenn Sie eigentlich printf eine Million Mal anrufen, gibt es sicherlich einen Unterschied für den Benutzer - es füllt seinen Bildschirm (oder Speicherplatz, oder was auch immer). Also klar ist es nicht rein.

Außerdem: Wenn Ihre Ausgabe umgeleitet wurde, um Ihre eigene Eingabe zu sein (etwas nutzlos, aber immer noch), würde Anruf printf beeinflussen, was Sie von getchar erhalten würden. :) So ist es auch direkt beobachtbar.

+3

Diese Antwort ist zwar korrekt, hat aber nichts mit 'printf' zu tun. Es wird auch nicht angesprochen ** WHY ** 'printf' ist unrein (extern - im Gegensatz zu internen - Nebenwirkungen). –

+0

Sind alle Funktionen unrein? Sie haben Zeit zum Ausführen (Philosophie)! BTW - 'bar' kehrt zurück x –

+0

@DavidTitarenco: Du hast Recht, ich habe nur hinzugefügt, danke! – Mehrdad

7

Es gibt zwei Teile, um eine reine Funktion zu sein. Die erste besagt, dass die Funktion für dieselben Eingabeparameter immer denselben Wert zurückgeben muss. Das zweite Kriterium, das printf nicht erfüllt, ist, dass die Funktion keine Nebenwirkungen wie E/A oder Objektmutation haben darf.

+1

'printf' erfüllt nicht einmal das erste Kriterium: Es gibt eine Anzahl von Zeichen ** erfolgreich ** gedruckt. – Vladimir

+0

@Vladimir: Immer wenn Sie den gleichen Eingabeparameter angeben, wird immer derselbe Wert zurückgegeben (was ist die Anzahl der Zeichen ** erfolgreich ** gedruckt). Wie erfüllt es ** nicht ** die ersten Kriterien? – cirronimbo

+0

Der zurückgegebene Wert kann abhängig von a) der Implementierung von printf und b) Fehlern beim Schreiben variieren. Stellen Sie sich vor, wenn stdout geschlossen ist. Hier ist ein Beispiel: http://pastebin.com/HAtCm2Jh – Vladimir

3

Einfach gesagt, printf ist unrein, weil es I/O tut. I/O per Definition ist wegen des Vorhandenseins des externen Zustandes des I/O Gerätes unrein (Zustand, der von Ausführung zu Ausführung schwanken kann).

0

printf() ist unrein, weil es Ausgabe in ein E/A-Gerät als Nebenwirkung verursacht .....

1

Die Bedeutung der reinen Funktionen in der Programmierung ist, dass die Umsetzung einen Anruf von einer reinen Funktion optimieren kann aus wenn es bereits das Ergebnis eines Aufrufs dieser Funktion mit den gleichen Parametern hat. Das kann natürlich nicht für printf-Aufrufe getan werden.

P.S. Auch nach Ihrer Definition ist printf unrein, weil es einen Wert zurückgeben kann, wenn es erfolgreich ist, und einen anderen Wert, wenn es einen E/A-Fehler gibt, z. B. nicht genügend Platz auf dem Ausgabegerät.

0

Viele der Antworten erklären, dass printf I/O als Nebeneffekt hat, aber printf kann auch andere Nebenwirkungen haben. Der Spezifizierer %n ermöglicht beispielsweise printf bis Schreiben an eine angegebene Adresse (und ist die Ursache für einige Sicherheitslücken).