C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

printf()
Goto page 1, 2, 3, 4  Next
 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German)
View previous topic :: View next topic  
Author Message
Sebastian Bormann
Guest





PostPosted: Mon Apr 16, 2007 7:41 pm    Post subject: printf() Reply with quote



Kann mir jmd bitte den Unterschied zwischen printf() und cout erklären.

Danke Sebastian
Back to top
Florian Kesseler
Guest





PostPosted: Mon Apr 16, 2007 9:50 pm    Post subject: Re: printf() Reply with quote



Sebastian Bormann schrieb:
Quote:
Kann mir jmd bitte den Unterschied zwischen printf() und cout erklären.

cout ist objektorientiert, printf nicht. Alle anderen Unterschiede
lassen sich daraus ableiten...
Back to top
Carsten Breuer
Guest





PostPosted: Mon Apr 16, 2007 10:42 pm    Post subject: Re: printf() Reply with quote



Quote:
Kann mir jmd bitte den Unterschied zwischen printf() und cout erklären.

Kurz gesagt: printf() ist C und cout ist C++
Etwas länger: Mit printf() kannst du nur elementare Datentypen ausgeben
(und musst dabei aufpassen, dass Formatstring und Parameterlister
übereinstimmen), cout wird mit dem <<-Operator verwendet, den du für
eigene Objekte überladen kannst.

Grüße

Carsten
Back to top
Björn Hendriks
Guest





PostPosted: Tue Apr 17, 2007 2:44 am    Post subject: Re: printf() Reply with quote

Sebastian Bormann wrote:

Quote:
Kann mir jmd bitte den Unterschied zwischen printf() und cout
erklären.

Meiner Ansicht nach liegt der Hauptvorteil von cout in der Typsicherheit.

Was bedeutet das?

printf ist eine globale Funktion, die als ersten Parameter einen Zeiger auf
einen Formatstring erwartet. Alle weiteren Parameter können beliebig sein,
denn es handelt sich um eine variable Argumentliste. Welche Parameter
printf im Einzelnen braucht, steht im Formatstring. Es gibt jedoch weder
für den Compiler zur Übersetzungszeit noch für die Funktion printf zur
Laufzeit die Möglichkeit zu prüfen, ob tatsächlich die erwarteten Parameter
übergeben wurden.

Beispiel mit 32 bit-Integern:

printf("Zahl %d, Buchstabe %c\n", 'x', 3Cool;

Hier wird printf das 'x' und die ersten drei Bytes des Integers 38 als
Integerzahl interpretieren und das letzte Byte der 38 als Buchstaben, du
erhältst also etwas völlig anderes als erwartet, ohne dass du irgendwie
gewarnt würdest, denn printf ist nicht typsicher.


cout dagegen ist eine Instanz der Klasse std::ostream, die in die
Standardausgabe schreibt. std::ostream ist ein Spezialfall des Templates
std::basic_ostream. std::basic_ostream enthält zahlreiche Überladungen des
Operators <<, die der Ausgabe von Daten dienen. Anhand des Datentyps, der
rechts von << steht, wählt der Compiler die passende Variante des Operators
aus. Falls er keine findet, gibt er eine Fehlermeldung aus, daher ist cout
mit dem Operator << typsicher.


HTH

Björn
Back to top
Daniels78
Guest





PostPosted: Tue Apr 17, 2007 2:27 pm    Post subject: Re: printf() Reply with quote

Sebastian Bormann wrote:
Quote:
Kann mir jmd bitte den Unterschied zwischen printf() und cout erklären.

Danke Sebastian

printf() ist auf jeden Fall die schnellere Möglichkeit.
gruss dan
Back to top
James Kanze
Guest





PostPosted: Tue Apr 17, 2007 7:07 pm    Post subject: Re: printf() Reply with quote

On Apr 16, 4:41 pm, Sebastian Bormann
<sebastian.borm...@s2002.tu-chemnitz.de> wrote:

Quote:
Kann mir jmd bitte den Unterschied zwischen printf() und cout erklären.

Wichtige Unterschiede:

-- printf nimmt den Typ ausschließlich aus der
Formattierungskette. Passt der tatsächliche Typ (bzw. Anzahl
von Elementen) nicht mit diesem zusammen, dann hast du Pech
gehabt. (Klassisches Beispiel aus der älteren 16-Bit Welt:
du benutzt %d zum Ausgeben eines ints. Später kommt es vor,
dass du Werte größer als 32000 hast; also aus dem int wird
long. Und der printf geht schief. Da die Formattierungskette
aus einer sprachabhängigen Datei gelesen wurde, muss du also
diese Datei für alle unterstuzten Sprache auch anpassen.
Viel Spass.)

-- printf gilt nur für vordefinierte Basistypen, cout lässt sich
auf jedem möglichen Typ ergänzen.

-- printf verbindet Formattieren und den Datensink. Die
printf-Familien bietet lediglich formattieren nach Dateien
und Zeichenketten an. cout (oder ostream) trennt diese zwei
Aspekte; du kannst also selbe neue Datensinken entwicklen:
nach Sockets, z.B. oder filtriert nach einem schon
vorhandenen Sink.

-- Bei cout liegen die Details der Formattierung nicht direkt
im Text, sondern werden von Benutzer spezifischen
Manipulatoren angegeben. Also, statt:
printf( "%.2f %.2f", a/b * 100, betrag ) ;
einfach:
cout << percent << a/b * 100 << currency << betrag ;
Beim Lesen ist m.E. die Bedeutung von "percent" bzw.
"currency" eindeutig klarer als die von "%.2f bzw. "%.2f".
Und wenn entscheidet wird, dass die "percent" überall mit
nur ein Dezimal nach dem Komma, statt zwei, ausgegeben
werden, dann ist die Änderung in nur eine Stelle
auszuführen. (Und wenn man merkt, dass "double" nicht der
richtige Typ für Geldbeträge ist, und es mit einer Klasse
Decimal ersetzt, springt der zweite Punkt, oben, in
Betracht.)

Dazu muss man bei printf eine neue, relativ unintuitive Sprache
lernen. Für die meisten Anwendungen braucht man freilich sehr
wenig davon, aber immerhin.

Aus der Praxis kann ich sagen, dass ich nie ein Programm
geschrieben habe, wo ich nicht meine eigene operator<< und
Manipulatoren zugefügt habe, und äußerst selten eins, wo ich
keine eigene streambuf benutzt habe.

--
James Kanze (GABI Software) email:james.kanze (AT) gmail (DOT) com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
Back to top
Elcaro Nosille
Guest





PostPosted: Tue Apr 17, 2007 8:10 pm    Post subject: Re: printf() Reply with quote

Daniels78 schrieb:

Quote:
Kann mir jmd bitte den Unterschied zwischen printf()
und cout erklären.

printf() ist auf jeden Fall die schnellere Möglichkeit.

Wie kommst Du darauf, dass printf() prinzipiell schneller ist?
Back to top
Christoph Bartoschek
Guest





PostPosted: Tue Apr 17, 2007 8:39 pm    Post subject: Re: printf() Reply with quote

Sebastian Bormann wrote:

Quote:
Kann mir jmd bitte den Unterschied zwischen printf() und cout
erklären.

printf hat auch den Vorteil, dass man einfach die Stellen hinter dem Komma
bei Gleitkommazahlen bestimmen kann.

Christoph
Back to top
Markus Moll
Guest





PostPosted: Tue Apr 17, 2007 9:06 pm    Post subject: Re: printf() Reply with quote

Hi

Daniels78 wrote:
Quote:
Sebastian Bormann wrote:
Kann mir jmd bitte den Unterschied zwischen printf() und cout
erklären.

Danke Sebastian

printf() ist auf jeden Fall die schnellere Möglichkeit.

a) Verallgemeinerungen stimmen nie.
b) Was meinst du damit? Schneller zu tippen? Schneller bei der
Ausführung? Beides möchte ich abstreiten, zumal in dieser Pauschalität.

Markus
Back to top
Rolf Magnus
Guest





PostPosted: Tue Apr 17, 2007 10:23 pm    Post subject: Re: printf() Reply with quote

Elcaro Nosille wrote:

Quote:
Daniels78 schrieb:

Kann mir jmd bitte den Unterschied zwischen printf()
und cout erklären.

printf() ist auf jeden Fall die schnellere Möglichkeit.

Wie kommst Du darauf, dass printf() prinzipiell schneller ist?

Ich würde auch gerne wissen, warum printf() trotz des zusätzlich nötigen
Parsers schneller sein soll.
Back to top
Dirk Clemens
Guest





PostPosted: Tue Apr 17, 2007 10:42 pm    Post subject: Re: printf() Reply with quote

Björn Hendriks wrote:
Quote:
Sebastian Bormann wrote:

Kann mir jmd bitte den Unterschied zwischen printf() und cout
erklären.

Meiner Ansicht nach liegt der Hauptvorteil von cout in der Typsicherheit.

Und ich dachte der Hauptunterschied wäre, dass printf() eine Funktion
und cout eine Variable von Typ std::ostream ist. Außerdem exisitert
cout nur unter C++, printf() dagegen unter C und C++.

Quote:
Es gibt jedoch weder
für den Compiler zur Übersetzungszeit noch für die Funktion printf zur
Laufzeit die Möglichkeit zu prüfen, ob tatsächlich die erwarteten Parameter
übergeben wurden.

Und wieso warnt mich dann mein Compiler, wenn ich nicht passende
Parameter übergebe?

Quote:

Beispiel mit 32 bit-Integern:

printf("Zahl %d, Buchstabe %c\n", 'x', 3Cool;

Hier wird printf das 'x' und die ersten drei Bytes des Integers 38 als
Integerzahl interpretieren und das letzte Byte der 38 als Buchstaben, du
erhältst also etwas völlig anderes als erwartet, ohne dass du irgendwie
gewarnt würdest, denn printf ist nicht typsicher.

Für einen erfahrenden C-Programmierer ist die Ausgabe sofort und
schnell nachzuvollziehen und keinesfalls unerwartet.


Ich würde eher sagen: print() und cout sind 2 verschiedene Philosophien,
von denen *ich* auch unter C++ die printf()-Varianten klar vorziehe,
weil ich sie für viel einfacher und übersichtlicher halte.

Dirk
Back to top
Jirka Klaue
Guest





PostPosted: Tue Apr 17, 2007 10:49 pm    Post subject: Re: printf() Reply with quote

Björn Hendriks:

Quote:
printf ist eine globale Funktion, die als ersten Parameter einen Zeiger auf
einen Formatstring erwartet. Alle weiteren Parameter können beliebig sein,
denn es handelt sich um eine variable Argumentliste. Welche Parameter
printf im Einzelnen braucht, steht im Formatstring. Es gibt jedoch weder
für den Compiler zur Übersetzungszeit noch für die Funktion printf zur
Laufzeit die Möglichkeit zu prüfen, ob tatsächlich die erwarteten Parameter
übergeben wurden.

Ich hoffe, Dir ist klar, daß der Compiler selbstverständlich die
Möglichkeit hat, die Typen zu prüfen und das i.A. auch tut.

Jirka
Back to top
Nicolas Pavlidis
Guest





PostPosted: Wed Apr 18, 2007 2:49 am    Post subject: Re: printf() Reply with quote

Elcaro Nosille wrote:
Quote:
Daniels78 schrieb:

Kann mir jmd bitte den Unterschied zwischen printf()
und cout erklären.

printf() ist auf jeden Fall die schnellere Möglichkeit.

Wie kommst Du darauf, dass printf() prinzipiell schneller ist?

AFAIK mach die "echte" Arbeit bei den iostreams der streambuffer, da
drinnen sind AFAIK virtuelle Memberfunktionen drinnen, und nach dem der
Aufruf über VTable ein bissi langsamer ist als der direkte, kann es
schon sein, dass prinf() schneller ist, im Hintergrund ist bei den
iostreams recht viel los, allerdigs würde mich reine Performace nicht
vom Benutzen der iostreams nicht abhalten, eifnach weil printf viel zu
gefährlich ist und auch nicht erweiterbar ist.

Allerdings hat printf halt auch eine andere wirlich gte Performance, es
gehört zu den Konstrukten bei denen man sich am schnellsten selber ins
Knie schiesen kann Smile.

LG
Nicolas
Back to top
Stefan Reuther
Guest





PostPosted: Wed Apr 18, 2007 10:22 pm    Post subject: Re: printf() Reply with quote

Jirka Klaue wrote:
Quote:
Björn Hendriks:
printf ist eine globale Funktion, die als ersten Parameter einen
Zeiger auf einen Formatstring erwartet. Alle weiteren Parameter
können beliebig sein, denn es handelt sich um eine variable
Argumentliste. Welche Parameter printf im Einzelnen braucht, steht
im Formatstring. Es gibt jedoch weder für den Compiler zur
Übersetzungszeit noch für die Funktion printf zur Laufzeit die
Möglichkeit zu prüfen, ob tatsächlich die erwarteten Parameter
übergeben wurden.

Ich hoffe, Dir ist klar, daß der Compiler selbstverständlich die
Möglichkeit hat, die Typen zu prüfen und das i.A. auch tut.

Ein Compiler muss 'printf("%d", 2.0)' zumindest übersetzen. Warnungen
bezüglich nichtpassender Typen sind mir nur vom gcc geläufig, und auch
da nur für hinreichend konstante Formatstrings.


Stefan
Back to top
Stefan Reuther
Guest





PostPosted: Wed Apr 18, 2007 10:32 pm    Post subject: Re: printf() Reply with quote

Nicolas Pavlidis wrote:
Quote:
Elcaro Nosille wrote:
Daniels78 schrieb:
Kann mir jmd bitte den Unterschied zwischen printf()
und cout erklären.

printf() ist auf jeden Fall die schnellere Möglichkeit.

Wie kommst Du darauf, dass printf() prinzipiell schneller ist?

AFAIK mach die "echte" Arbeit bei den iostreams der streambuffer, da
drinnen sind AFAIK virtuelle Memberfunktionen drinnen, und nach dem der
Aufruf über VTable ein bissi langsamer ist als der direkte, kann es
schon sein, dass prinf() schneller ist

Diesen "virtuellen Aufruf" hast du bei printf normalerweise auch. Da der
Bibliothekshersteller ungern den Formatter zweimal implementieren will,
für sprintf und fprintf, wird das i.A. auf eine interne Funktion
abgebildet, die letztenendes die eigentliche Ausgabe (in String oder
FILE*) über einen Funktionszeiger erledigt. iostreams / streambuffers
machen einfach diesen Mechanismus dem Nutzer zugänglich, damit er eigene
Backends schreiben kann.

Immerhin wird eine Menge Aufwand getrieben, die Anzahl virtueller
Aufrufe zu minimieren. Für die reine Funktionalität ohne Performance
hätte es 'virtual void write(const char*, size_t)' getan, aber nein, es
musste ein kompliziertes Schema mit pptr(), pbase() usw. sein.

Historische Implementationen von iostream waren gerne mal langsamer als
stdio, einfach deswegen, weil sie im Hintergrund stdio aufgerufen haben
und daher prinzipbedingt nicht schneller sein konnten. Man kann das auch
anders abbilden (IIRC ist bei einer Version der GNU-Library FILE* ein
streambuf, oder sowas in der Art). Das interessiert mich aber momentan
eher weniger: wenn Performance wirklich ein Problem ist, gehe ich gleich
auf Betriebssysteminterfaces wie open/read/write/close. Wenn ich aber
die Wahl zwischen printf() und cout habe, ist Performance i.A. eh kein
Problem.


Stefan
Back to top
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German) All times are GMT
Goto page 1, 2, 3, 4  Next
Page 1 of 4

 
 


Powered by phpBB © 2001, 2006 phpBB Group