Ich bin überrascht, dass jeder in dieser Frage behauptet, das std::cout
sei viel besser als printf
, auch wenn die Frage nur nach Unterschieden gefragt hat. Jetzt gibt es einen Unterschied - std::cout
ist C ++ und printf
ist C (Sie können es jedoch in C ++ verwenden, genau wie fast alles andere von C). Jetzt werde ich hier ehrlich sein; beide printf
und std::cout
haben ihre Vorteile.
std::cout
ist erweiterbar. Ich weiß, dass die Leute sagen werden, dass dies auch printf
erweiterbar ist, aber eine solche Erweiterung wird im C-Standard nicht erwähnt (Sie müssten also nicht standardmäßige Funktionen verwenden - aber es gibt nicht einmal übliche nicht standardmäßige Funktionen), und solche Erweiterungen bestehen aus einem Buchstaben (so ist es leicht, mit einem bereits vorhandenen Format in Konflikt zu geraten).
Im Gegensatz zu printf
, std::cout
vollständig auf Operatorüberladung abhängt, so ist es kein Problem mit benutzerdefinierten Formaten - alles , was Sie tun , ist ein Unterprogramm Mitnahmen definieren std::ostream
als erstes Argument und Ihre Art als zweites. Daher gibt es keine Namespace-Probleme. Solange Sie eine Klasse haben (die nicht auf ein Zeichen beschränkt ist), können Sie arbeitenstd::ostream
Überladung kommen.
Ich bezweifle jedoch, dass viele Leute erweitern möchten ostream
(um ehrlich zu sein, habe ich solche Erweiterungen selten gesehen, auch wenn sie einfach zu erstellen sind). Es ist jedoch hier, wenn Sie es brauchen.
Wie leicht zu erkennen war, verwenden beide printf
und std::cout
unterschiedliche Syntax. printf
Verwendet die Standardfunktionssyntax unter Verwendung von Musterzeichenfolgen und Argumentlisten mit variabler Länge. Tatsächlich printf
ist dies ein Grund, warum C sie hat - printf
Formate sind zu komplex, um ohne sie verwendet werden zu können. Verwendet std::cout
jedoch eine andere API - dieoperator <<
API, die sich selbst zurückgibt.
Im Allgemeinen bedeutet dies, dass die C-Version kürzer ist, aber in den meisten Fällen spielt dies keine Rolle. Der Unterschied macht sich bemerkbar, wenn Sie viele Argumente drucken. Wenn Sie unter der Error 2: File not found.
Annahme einer Fehlernummer etwas schreiben müssen und die Beschreibung einen Platzhalter enthält, sieht der Code folgendermaßen aus. Beide Beispiele funktionieren identisch (nun, irgendwie wird std::endl
der Puffer tatsächlich geleert).
printf("Error %d: %s.\n", id, errors[id]);
std::cout << "Error " << id << ": " << errors[id] << "." << std::endl;
Dies scheint zwar nicht zu verrückt zu sein (es ist nur zweimal länger), aber die Dinge werden verrückter, wenn Sie Argumente tatsächlich formatieren, anstatt sie nur zu drucken. Zum Beispiel ist das Drucken von so etwas 0x0424
einfach verrückt. Dies wird durch den std::cout
Mischzustand und die tatsächlichen Werte verursacht. Ich habe nie eine Sprache gesehen, in der so etwas wie std::setfill
ein Typ wäre (außer natürlich C ++). printf
trennt Argumente und tatsächlichen Typ klar voneinander. Ich würde es wirklich vorziehen, die printf
Version davon beizubehalten (auch wenn sie irgendwie kryptisch aussieht) im Vergleich zur iostream
Version davon (da sie zu viel Rauschen enthält).
printf("0x%04x\n", 0x424);
std::cout << "0x" << std::hex << std::setfill('0') << std::setw(4) << 0x424 << std::endl;
Hier liegt der wahre Vorteil von printf
. Die printf
Formatzeichenfolge ist gut ... eine Zeichenfolge. Das macht es wirklich einfach zu übersetzen, verglichen mit operator <<
Missbrauch von iostream
. Angenommen, die gettext()
Funktion übersetzt Error 2: File not found.
den Code, um die Übersetzung der zuvor angezeigten Formatzeichenfolge zu erhalten , und Sie möchten ihn anzeigen , sieht folgendermaßen aus:
printf(gettext("Error %d: %s.\n"), id, errors[id]);
Nehmen wir nun an, wir übersetzen in Fictionish, wobei die Fehlernummer nach der Beschreibung steht. Die übersetzte Zeichenfolge würde so aussehen %2$s oru %1$d.\n
. Wie geht das in C ++? Nun, ich habe keine Ahnung. Ich denke, Sie können Fälschungen machen, an iostream
die Sie Konstrukte weitergeben printf
können gettext
, oder etwas anderes, um sie zu übersetzen. Natürlich $
ist es kein C-Standard, aber es ist so häufig, dass es meiner Meinung nach sicher ist.
C hat viele ganzzahlige Typen, ebenso wie C ++. std::cout
behandelt alle Typen für Sie, printf
erfordert jedoch abhängig von einem Integer-Typ eine bestimmte Syntax (es gibt Nicht-Integer-Typen, aber der einzige Nicht-Integer-Typ, mit dem Sie in der Praxis arbeiten, printf
ist const char *
(C-Zeichenfolge, kann mit der to_c
Methode von erhalten werden std::string
)). Zum Drucken size_t
müssen Sie beispielsweise verwenden %zd
, während int64_t
die Verwendung erforderlich ist %"PRId64"
. Die Tabellen sind unter http://en.cppreference.com/w/cpp/io/c/fprintf und http://en.cppreference.com/w/cpp/types/integer verfügbar .
\0
Da printf
im Gegensatz zu C ++ - Zeichenfolgen C-Zeichenfolgen verwendet werden, kann kein NUL-Byte ohne bestimmte Tricks gedruckt werden. In bestimmten Fällen ist die Verwendung %c
mit möglich'\0'
als Argument zu verwenden, obwohl dies eindeutig ein Hack ist.
Update: Es stellt sich heraus, dass iostream
es so langsam ist, dass es normalerweise langsamer als Ihre Festplatte ist (wenn Sie Ihr Programm in eine Datei umleiten). Das Deaktivieren der Synchronisierung mit stdio
kann hilfreich sein, wenn Sie viele Daten ausgeben müssen. Wenn die Leistung ein echtes Problem darstellt (im Gegensatz zum Schreiben mehrerer Zeilen in STDOUT), verwenden Sie einfach printf
.
Jeder denkt, dass ihm die Leistung am Herzen liegt, aber niemand stört sich daran, sie zu messen. Meine Antwort ist, dass E / A sowieso ein Engpass ist, egal ob Sie printf
oder verwenden iostream
. Ich denke, das printf
könnte von einem kurzen Blick in die Assembly schneller sein (kompiliert mit clang unter Verwendung der -O3
Compiler-Option). Unter der Annahme meines Fehlerbeispiels führt das printf
Beispiel weit weniger Anrufe aus als das cout
Beispiel. Dies ist int main
mit printf
:
main: @ @main
@ BB#0:
push {lr}
ldr r0, .LCPI0_0
ldr r2, .LCPI0_1
mov r1, #2
bl printf
mov r0, #0
pop {lr}
mov pc, lr
.align 2
@ BB#1:
Sie können leicht feststellen, dass zwei Zeichenfolgen und 2
(Zahl) als printf
Argumente verwendet werden. Das ist alles; es gibt nichts anderes. Zum Vergleich wird dies iostream
zur Baugruppe kompiliert. Nein, es gibt kein Inlining. Jeder einzelne operator <<
Aufruf bedeutet einen weiteren Aufruf mit einem anderen Satz von Argumenten.
main: @ @main
@ BB#0:
push {r4, r5, lr}
ldr r4, .LCPI0_0
ldr r1, .LCPI0_1
mov r2, #6
mov r3, #0
mov r0, r4
bl _ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_l
mov r0, r4
mov r1, #2
bl _ZNSolsEi
ldr r1, .LCPI0_2
mov r2, #2
mov r3, #0
mov r4, r0
bl _ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_l
ldr r1, .LCPI0_3
mov r0, r4
mov r2, #14
mov r3, #0
bl _ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_l
ldr r1, .LCPI0_4
mov r0, r4
mov r2, #1
mov r3, #0
bl _ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_l
ldr r0, [r4]
sub r0, r0, #24
ldr r0, [r0]
add r0, r0, r4
ldr r5, [r0, #240]
cmp r5, #0
beq .LBB0_5
@ BB#1: @ %_ZSt13__check_facetISt5ctypeIcEERKT_PS3_.exit
ldrb r0, [r5, #28]
cmp r0, #0
beq .LBB0_3
@ BB#2:
ldrb r0, [r5, #39]
b .LBB0_4
.LBB0_3:
mov r0, r5
bl _ZNKSt5ctypeIcE13_M_widen_initEv
ldr r0, [r5]
mov r1, #10
ldr r2, [r0, #24]
mov r0, r5
mov lr, pc
mov pc, r2
.LBB0_4: @ %_ZNKSt5ctypeIcE5widenEc.exit
lsl r0, r0, #24
asr r1, r0, #24
mov r0, r4
bl _ZNSo3putEc
bl _ZNSo5flushEv
mov r0, #0
pop {r4, r5, lr}
mov pc, lr
.LBB0_5:
bl _ZSt16__throw_bad_castv
.align 2
@ BB#6:
Um ehrlich zu sein, bedeutet dies jedoch nichts, da E / A ohnehin der Engpass ist. Ich wollte nur zeigen, dass iostream
das nicht schneller ist, weil es "typsicher" ist. Die meisten C-Implementierungen implementieren printf
Formate mit berechnetem goto, so dass dies printf
so schnell wie möglich ist, auch ohne dass der Compiler sich dessen bewusst ist printf
(nicht, dass dies nicht der printf
Fall ist - einige Compiler können dies in bestimmten Fällen optimieren). Konstante Zeichenfolgen, die mit enden, werden \n
normalerweise auf optimiertputs
). .
Ich weiß nicht, warum Sie erben möchten ostream
, aber es ist mir egal. Das ist auch mit möglich FILE
.
class MyFile : public FILE {}
Richtig, Argumentlisten mit variabler Länge haben keine Sicherheit, aber das spielt keine Rolle, da gängige C-Compiler Probleme mit printf
Formatzeichenfolgen erkennen können, wenn Sie Warnungen aktivieren. Tatsächlich kann Clang dies tun, ohne Warnungen zu aktivieren.
$ cat safety.c
#include <stdio.h>
int main(void) {
printf("String: %s\n", 42);
return 0;
}
$ clang safety.c
safety.c:4:28: warning: format specifies type 'char *' but the argument has type 'int' [-Wformat]
printf("String: %s\n", 42);
~~ ^~
%d
1 warning generated.
$ gcc -Wall safety.c
safety.c: In function ‘main’:
safety.c:4:5: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘int’ [-Wformat=]
printf("String: %s\n", 42);
^
std::sort
, was im Vergleich zuqsort
(2-mal) irgendwie überraschend schnell ist Kosten der ausführbaren Größe).Aus den C ++ - FAQ :
Auf der anderen Seite
printf
ist es erheblich schneller, was es rechtfertigen kann, escout
in sehr spezifischen und begrenzten Fällen vorzuziehen. Profil immer zuerst. (Siehe zum Beispiel http://programming-designs.com/2009/02/c-speed-test-part-2-printf-vs-cout /)quelle
printf()
soll auch erweiterbar sein. Siehe "printf hooks" unter udrepper.livejournal.com/20948.htmlprintf
hat keine solche Fähigkeit. Nicht tragbare Bibliotheksmechanismen sind kaum auf dem Niveau der vollständig standardisierten Erweiterbarkeit von iostreams.Die Leute behaupten oft, das
printf
sei viel schneller. Dies ist größtenteils ein Mythos. Ich habe es gerade mit den folgenden Ergebnissen getestet:Fazit: Wenn Sie nur Zeilenumbrüche wünschen, verwenden Sie
printf
; Ansonstencout
ist es fast genauso schnell oder sogar noch schneller. Weitere Details finden Sie in meinem Blog .Um klar zu sein, ich versuche nicht zu sagen, dass
iostream
s immer besser sind alsprintf
; Ich versuche nur zu sagen, dass Sie eine fundierte Entscheidung treffen sollten, die auf realen Daten basiert, und keine wilde Vermutung, die auf einer allgemeinen, irreführenden Annahme basiert.Update: Hier ist der vollständige Code, den ich zum Testen verwendet habe. Kompiliert mit
g++
ohne zusätzliche Optionen (außer-lrt
für das Timing).quelle
printf()
undstd::ostream
besteht darin, dass erstere alle Argumente in einem einzigen Aufrufstd::ostream
ausgeben, während für jeden ein separater Aufruf erfolgt<<
. Der Test gibt nur ein Argument und eine neue Zeile aus. Deshalb können Sie den Unterschied nicht erkennen.printf
könnte eine Menge Anrufe unter der Decke zu Hilfsfunktionen für verschiedene Formatierung Bezeich machen ... das, oder es ist eine monströse monolithische Funktion. Und wieder sollte es wegen Inlining überhaupt keinen Unterschied in der Geschwindigkeit machen.sprintf
oderfprintf
undstringstream
oderfstream
.Und ich zitiere :
quelle
Eine ist eine Funktion, die auf stdout druckt. Das andere ist ein Objekt, das
operator<<
stdout mehrere Elementfunktionen und Überladungen dieses Drucks bereitstellt. Es gibt noch viele weitere Unterschiede, die ich aufzählen könnte, aber ich bin mir nicht sicher, wonach Sie suchen.quelle
Für mich sind die wirklichen Unterschiede, die mich dazu bringen würden, eher "cout" als "printf" zu wählen, folgende:
1) Der Operator << kann für meine Klassen überladen werden.
2) Der Ausgabestream für cout kann einfach in eine Datei geändert werden: (: Kopieren Einfügen :)
3) Ich finde cout besser lesbar, besonders wenn wir viele Parameter haben.
Ein Problem mit
cout
ist die Formatierungsoptionen. Das Formatieren der Daten (Genauigkeit, Ausrichtung usw.)printf
ist einfacher.quelle
printf
zu einer Datei wechseln , indem Sie sie durchfprintf
...Zwei Punkte, die hier nicht anders erwähnt werden und die ich für wichtig halte:
1)
cout
trägt viel Gepäck, wenn Sie die STL nicht bereits verwenden. Es fügt Ihrer Objektdatei mehr als doppelt so viel Code hinzu wieprintf
. Dies gilt auch fürstring
, und dies ist der Hauptgrund, warum ich meine eigene String-Bibliothek verwende.2)
cout
verwendet überladene<<
Operatoren, was ich unglücklich finde. Dies kann zu Verwirrung führen, wenn Sie den<<
Operator auch für den vorgesehenen Zweck verwenden (nach links verschieben). Ich persönlich möchte Betreiber nicht für Zwecke überlasten, die tangential zu ihrem Verwendungszweck sind.Fazit: Ich werde
cout
(undstring
) verwenden, wenn ich bereits die STL verwende. Ansonsten neige ich dazu, es zu vermeiden.quelle
Bei Grundelementen spielt es wahrscheinlich keine Rolle, welches Sie verwenden. Ich sage, wo es nützlich wird, wenn Sie komplexe Objekte ausgeben möchten.
Wenn Sie beispielsweise eine Klasse haben,
Nun, das Obige scheint vielleicht nicht so toll zu sein, aber nehmen wir an, Sie müssen dies an mehreren Stellen in Ihrem Code ausgeben. Angenommen, Sie fügen ein Feld "int d" hinzu. Mit cout müssen Sie es nur an einer Stelle ändern. Mit printf müssten Sie es jedoch möglicherweise an vielen Stellen ändern, und nicht nur das, Sie müssen sich auch daran erinnern, welche ausgegeben werden sollen.
Mit cout können Sie jedoch viel Zeit für die Wartung Ihres Codes sparen und nicht nur, dass Sie sich nicht wirklich um die Ausgabe kümmern müssen, wenn Sie das Objekt "Something" in einer neuen Anwendung wiederverwenden.
quelle
Natürlich können Sie "etwas" etwas besser schreiben, um die Wartung aufrechtzuerhalten:
Und ein etwas erweiterter Test von cout vs. printf, fügte einen Test von 'double' hinzu, wenn jemand mehr Tests durchführen möchte (Visual Studio 2008, Release-Version der ausführbaren Datei):
Das Ergebnis ist:
quelle
endl
so viel weniger effizient als'\n'
?endl
der Puffer geleert wird und\n
nicht, obwohl ich nicht sicher bin, ob dies definitiv der Grund dafür ist.Ich möchte darauf hinweisen, dass Sie
cout
einige interessante Ergebnisse erzielen können, wenn Sie mit Threads in C ++ spielen möchten .Betrachten Sie diesen Code:
Jetzt wird die Ausgabe komplett gemischt. Es kann auch zu unterschiedlichen Ergebnissen führen. Versuchen Sie es mehrmals:
Sie können verwenden
printf
, um es richtig zu machen, oder Sie können verwendenmutex
.Habe Spaß!
quelle
thread
s machen die Ausgabe nicht verrückt. Ich habe gerade beide reproduziert und gefundenxyz
undABC
in der Ausgabe. Es wurde nicht s / wABC
als zerfetztABABAB
.cout
mit Threads funktioniert, aber ich weiß mit Sicherheit, dass der Code, den Sie anzeigen, nicht der ist, mit dem Sie diese Ausgaben erhalten haben. Ihr Code übergibt die Zeichenfolge"ABC"
für Thread 1 und"xyz"
für Thread 2, aber Ihre Ausgabe zeigtAAA
undBBB
. Bitte beheben Sie es, weil es im Moment verwirrend ist.Beide werden zum Drucken von Werten verwendet. Sie haben eine völlig andere Syntax. C ++ hat beides, C hat nur printf.
quelle
Ich möchte sagen, dass der Mangel an Erweiterbarkeit
printf
nicht ganz stimmt:In C ist es wahr. Aber in C gibt es keine wirklichen Klassen.
In C ++ ist es möglich, den Cast-Operator zu überladen. Überladen Sie also einen
char*
Operator und verwenden Sieprintf
Folgendes:kann möglich sein, wenn Foo den guten Bediener überlastet. Oder wenn Sie eine gute Methode gemacht haben. Kurz gesagt,
printf
ist so erweiterbar wiecout
für mich.Technische Argumente, die ich für C ++ - Streams sehen kann (im Allgemeinen ... nicht nur cout.), Sind:
Typensicherheit. (Und übrigens, wenn ich eine einzelne drucken möchte, die
'\n'
ich benutzeputchar('\n')
... werde ich keine Atombombe verwenden, um ein Insekt zu töten.)Einfacher zu lernen. (keine "komplizierten" Parameter zu lernen, nur zu verwenden
<<
und>>
Operatoren)Arbeite nativ mit
std::string
(dennprintf
es gibtstd::string::c_str()
, aber fürscanf
?)Denn
printf
ich sehe:Einfachere oder zumindest kürzere (in Bezug auf die geschriebenen Zeichen) komplexe Formatierung. Für mich weitaus lesbarer (Geschmackssache, denke ich).
Bessere Kontrolle darüber, was die Funktion gemacht hat (Geben Sie zurück, wie viele Zeichen geschrieben wurden, und es gibt den
%n
Formatierer: "Nichts gedruckt. Das Argument muss ein Zeiger auf ein vorzeichenbehaftetes int sein, in dem die Anzahl der bisher geschriebenen Zeichen gespeichert ist." (Von printf - C ++ Referenz )Bessere Debugging-Möglichkeiten. Aus demselben Grund wie das letzte Argument.
Meine persönlichen Vorlieben beziehen sich auf
printf
(undscanf
) Funktionen, hauptsächlich weil ich kurze Zeilen liebe und weil ich nicht denke, dass Schreibprobleme beim Drucken von Text wirklich schwer zu vermeiden sind. Das einzige, was ich mit Funktionen im C-Stil bedaure, ist, dassstd::string
es nicht unterstützt wird. Wir müssen ein durchlaufen,char*
bevor wir es gebenprintf
(mit dem,std::string::c_str()
wenn wir lesen wollen, aber wie schreiben?)quelle
char*
wird nicht verwendet.char*
und wie lange das Leben und die Gefahren von benutzerdefinierten implizite Besetzungen.Weitere Unterschiede: "printf" gibt einen ganzzahligen Wert zurück (der der Anzahl der gedruckten Zeichen entspricht) und "cout" gibt nichts zurück
Und.
cout << "y = " << 7;
ist nicht atomar.printf("%s = %d", "y", 7);
ist atomar.cout führt typechecking durch, printf nicht.
Es gibt kein iostream-Äquivalent von
"% d"
quelle
cout
gibt nichts zurück, weil es ein Objekt ist, keine Funktion.operator<<
gibt etwas zurück (normalerweise der linke Operand, aber ein falscher Wert, wenn ein Fehler vorliegt). Und in welchem Sinne ist derprintf
Ruf "atomar"?printf("%s\n",7);
%s
ist?printf
% s- Argument muss einen gültigen Zeiger auf eine nullterminierte Zeichenfolge haben. Der Speicherbereich '7' (ein Zeiger) ist normalerweise nicht gültig; Ein Segmentierungsfehler könnte Glück haben. Auf einigen Systemen druckt '7' möglicherweise viel Müll auf eine Konsole, und Sie müssten ihn einen Tag lang ansehen, bevor das Programm beendet wird. Mit anderen Worten, das ist eine schlechte Sacheprintf
. Statische Analysewerkzeuge können viele dieser Probleme lösen.printf
keine Schreibprüfung durchgeführt wird, habe ich noch nie einen Compiler verwendet, der mich nicht vor Tippfehlern gewarnt hat mitprintf
...TL; DR: Machen Sie immer Ihre eigenen Nachforschungen hinsichtlich der Größe , Leistung , Lesbarkeit und Codierungszeit des generierten Maschinencodes , bevor Sie zufälligen Kommentaren online vertrauen, einschließlich dieser.
Ich bin kein Experte. Ich habe gerade zwei Mitarbeiter belauscht, die darüber sprachen, wie wir die Verwendung von C ++ in eingebetteten Systemen aufgrund von Leistungsproblemen vermeiden sollten. Interessanterweise habe ich einen Benchmark durchgeführt, der auf einer echten Projektaufgabe basiert.
In dieser Aufgabe mussten wir eine Konfiguration in den RAM schreiben. Etwas wie:
Hier sind meine Benchmark-Programme (Ja, ich weiß, dass OP nach printf () und nicht nach fprintf () gefragt hat. Versuchen Sie, die Essenz zu erfassen, und der Link von OP verweist übrigens trotzdem auf fprintf ().)
C-Programm:
C ++ - Programm:
Ich habe mein Bestes getan, um sie zu polieren, bevor ich sie beide 100.000 Mal geloopt habe. Hier sind die Ergebnisse:
C-Programm:
C ++ - Programm:
Objektdateigröße:
Fazit: Auf meiner ganz bestimmten Plattform mit einem ganz bestimmten Prozessor , auf dem eine ganz bestimmte Version des Linux-Kernels ausgeführt wird, um ein Programm auszuführen, das mit einer ganz bestimmten Version von GCC kompiliert wurde , um eine ganz bestimmte Aufgabe zu erfüllen , würde ich sagen Der C ++ - Ansatz ist besser geeignet, da er erheblich schneller ausgeführt wird und eine viel bessere Lesbarkeit bietet. Auf der anderen Seite bedeutet C einen geringen Platzbedarf, was meiner Meinung nach fast nichts bedeutet, da die Programmgröße nicht unser Anliegen ist.
Denken Sie daran, YMMV.
quelle
Ich bin kein Programmierer, aber ich war ein Ingenieur für menschliche Faktoren. Ich bin der Meinung, dass eine Programmiersprache leicht zu erlernen, zu verstehen und zu verwenden sein sollte, und dies erfordert eine einfache und konsistente Sprachstruktur. Obwohl alle Sprachen symbolisch und daher im Kern willkürlich sind, gibt es Konventionen, deren Befolgung das Erlernen und Verwenden der Sprache erleichtert.
Es gibt eine Vielzahl von Funktionen in C ++ und anderen Sprachen, die als Funktion (Parameter) geschrieben wurden, eine Syntax, die ursprünglich für funktionale Beziehungen in der Mathematik in der Zeit vor dem Computer verwendet wurde.
printf()
folgt dieser Syntax und wenn die Autoren von C ++ eine logisch andere Methode zum Lesen und Schreiben von Dateien erstellen wollten, hätten sie einfach eine andere Funktion mit einer ähnlichen Syntax erstellen können.In Python können wir natürlich mit der ebenfalls ziemlich standardmäßigen
object.method
Syntax drucken , dh variablename.print, da Variablen Objekte sind, in C ++ jedoch nicht.Ich mag die Cout-Syntax nicht, weil der Operator << keine Regeln befolgt. Es ist eine Methode oder Funktion, dh es nimmt einen Parameter und macht etwas damit. Es ist jedoch so geschrieben, als wäre es ein mathematischer Vergleichsoperator. Dies ist aus menschlicher Sicht ein schlechter Ansatz.
quelle
printf
ist eine Funktion, währendcout
es sich um eine Variable handelt.quelle
printf
ist eine Funktion, aberprintf()
ist ein Funktionsaufruf =)