Viele C ++ - Bücher enthalten Beispielcode wie diesen ...
std::cout << "Test line" << std::endl;
... also habe ich das auch immer gemacht. Aber ich habe stattdessen viel Code von arbeitenden Entwicklern wie diesen gesehen:
std::cout << "Test line\n";
Gibt es einen technischen Grund, einen dem anderen vorzuziehen, oder ist es nur eine Frage des Codierungsstils?
c++
coding-style
iostream
c++-faq
Head Geek
quelle
quelle
'\n'
.Antworten:
Die unterschiedlichen Zeichen am Zeilenende spielen keine Rolle, vorausgesetzt, die Datei ist im Textmodus geöffnet. Dies erhalten Sie, wenn Sie nicht nach Binärdateien fragen. Das kompilierte Programm schreibt das Richtige für das kompilierte System aus.
Der einzige Unterschied besteht darin, dass
std::endl
der Ausgabepuffer geleert wird und'\n'
nicht. Wenn Sie nicht möchten, dass der Puffer häufig geleert wird, verwenden Sie'\n'
. Wenn Sie dies tun (z. B. wenn Sie die gesamte Ausgabe erhalten möchten und das Programm instabil ist), verwenden Siestd::endl
.quelle
::std::cerr
statt,::std::cout
da es bei jeder Ausgabeoperation ungepuffert und geleert ist.stderr
ist für "Fehler". Wenn Sie so wollen, handelt es sich eher um Out-of-Band-Diagnosemeldungen. Es sollte möglich sein,./prog > file
nur die wahre Programmnutzlast zu sagen und zu speichern, aber das Programm möchte möglicherweise auch bei normaler Interaktion viel mehr Statusinformationen ausgeben.Der Unterschied kann durch Folgendes veranschaulicht werden:
ist äquivalent zu
Damit,
std::endl
Wenn Sie eine sofortige Spülung des Ausgangs erzwingen möchten.\n
Sie diese Option, wenn Sie sich Sorgen um die Leistung machen (was wahrscheinlich nicht der Fall ist, wenn Sie den<<
Operator verwenden).Ich benutze
\n
auf den meisten Linien.Verwenden Sie dann
std::endl
am Ende eines Absatzes (aber das ist nur eine Gewohnheit und normalerweise nicht notwendig).Im Gegensatz zu anderen Behauptungen wird das
\n
Zeichen nur dann dem richtigen Ende der Zeilenfolge der Plattform zugeordnet, wenn der Stream zu einer Datei wechselt (std::cin
undstd::cout
spezielle, aber immer noch Dateien (oder dateiähnlich) sind).quelle
cout
zu gebunden istcin
, was bedeutet , dass , wenn Sie eine Eingabe von gelesencin
,cout
wird zunächst gespült werden. Wenn Sie jedoch einen Fortschrittsbalken oder etwas anzeigen möchten, ohne davon zu lesencin
, ist das Spülen sicher hilfreich.operator<<
das nicht performant ist, oder welche Alternative für die Performance? Bitte verweisen Sie mich auf Material, um dies besser zu verstehen.sync_with_stdio(false)
und Ihre Ausgabe nicht kontinuierlich zu leeren . Lassen Sie die Bibliothek herausfinden, wann dies zu tun ist. stackoverflow.com/a/1926432/14065sync_with_stdio
die iostreams so schnell wie stdio macht. Es tut nichtMöglicherweise treten Leistungsprobleme auf,
std::endl
wodurch ein Löschen des Ausgabestreams erzwungen wird.quelle
Dort ist ein weiterer Funktionsaufruf enthalten, wenn Sie ihn verwenden möchten
std::endl
a) ruft den Betreiber
<<
einmal an.b) ruft den Betreiber
<<
zweimal an.quelle
std::cout << "Hello" << "\n";
?<<
wären die Aufrufe von the auch in dem Fall a 2 , daher würde ich nicht behaupten, dass ein oder zwei<<
(oder zwei Funktionsaufrufe im Allgemeinen) a erforderlich sind Unterschied zwischen\n
undendl
.Ich erinnerte mich daran, dass ich im Standard darüber gelesen hatte.
Siehe C11-Standard, der definiert, wie sich die Standard-Streams verhalten, da C ++ - Programme die CRT verbinden. Der C11-Standard sollte hier die Spülrichtlinie regeln.
Dies bedeutet, dass
std::cout
undstd::cin
genau dann vollständig gepuffert werden, wenn sie sich auf ein nicht interaktives Gerät beziehen. Mit anderen Worten, wenn stdout an ein Terminal angeschlossen ist, gibt es keinen Unterschied im Verhalten.Wenn dies
std::cout.sync_with_stdio(false)
jedoch aufgerufen wird,'\n'
wird auch bei interaktiven Geräten kein Flush verursacht. Andernfalls'\n'
entspricht dies demstd::endl
Weiterleiten an Dateien: c ++ ref on std :: endl .quelle
Sie schreiben beide die entsprechenden Zeilenendezeichen. Zusätzlich dazu wird durch endl der Puffer festgeschrieben. Normalerweise möchten Sie endl nicht verwenden, wenn Sie Datei-E / A ausführen, da die unnötigen Festschreibungen die Leistung beeinträchtigen können.
quelle
Keine große Sache, aber endl funktioniert nicht in boost :: lambda .
quelle
Wenn Sie Qt und verwenden
endl
, könnten Sie versehentlich ein falsches verwendenendl
, was zu sehr überraschenden Ergebnissen führt. Siehe den folgenden Codeausschnitt:Beachten Sie, dass ich
endl
anstelle vonstd::endl
(was richtig gewesen wäre) geschrieben habe und anscheinend eineendl
Funktion in qtextstream.h definiert ist (die Teil von QtCore ist).Verwenden Sie potenzielle Namespace-Probleme,
"\n"
anstatt sieendl
vollständig zu umgehen. Dies ist auch ein gutes Beispiel dafür, warum das Einfügen von Symbolen in den globalen Namespace (wie dies Qt standardmäßig tut) eine schlechte Idee ist.quelle
using namespace std;
? :-)using namespace std;
. Es wird als schlechte Praxis angesehen. Siehe Warum wird der Namespace std verwendet? als schlechte Praxis angesehen?Ich hatte immer die Angewohnheit, nur std :: endl zu verwenden, weil es für mich leicht zu sehen ist.
quelle
Der
std::endl
Manipulator entspricht'\n'
.std::endl
Spült aber immer den Strom.quelle
Wenn Sie beabsichtigen, Ihr Programm auf etwas anderem als Ihrem eigenen Laptop auszuführen, verwenden Sie die
endl
Anweisung niemals . Vor allem, wenn Sie viele kurze Zeilen schreiben oder wie ich oft einzelne Zeichen in einer Datei gesehen habe. Die Verwendung vonendl
ist bekannt, um vernetzte Dateisysteme wie NFS zu töten.quelle
Mit Referenz Dies ist ein E / A-Manipulator nur für die Ausgabe .
std::endl
Fügt ein Zeilenumbruchzeichen in die Ausgabesequenz os ein und löscht es wie durch Aufrufenos.put(os.widen('\n'))
gefolgt vonos.flush()
.Wann zu verwenden:
Dieser Manipulator kann verwendet werden , um eine Linie von produzieren sofort ausgegeben ,
z.B
Ebenfalls
quelle