728 Stimmen

"std::endl" vs " \n "

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 eine Menge Code von arbeitenden Entwicklern gesehen, der so aussieht:

std::cout << "Test line\n";

Gibt es einen technischen Grund, das eine dem anderen vorzuziehen, oder ist es nur eine Frage des Codierungsstils?

15 Stimmen

32 Stimmen

@derobert dieser ist älter als der andere

8 Stimmen

@HediNaily in der Tat ist es. Aber die Antwort auf die andere scheint mir etwas besser zu sein, also habe ich mich dafür entschieden, es so zu machen. Außerdem ist die andere etwas breiter angelegt und deckt auch '\n' .

581voto

David Thornley Punkte 55244

Die unterschiedlichen Zeilenendzeichen spielen keine Rolle, vorausgesetzt, die Datei ist im Textmodus geöffnet, und das ist es, was Sie erhalten, wenn Sie nicht nach binär fragen. Das kompilierte Programm wird das Richtige für das System ausgeben, für das es kompiliert wurde.

Der einzige Unterschied besteht darin, dass std::endl leert den Ausgabepuffer, und '\n' nicht. Wenn Sie nicht wollen, dass der Puffer häufig geleert wird, verwenden Sie '\n' . Wenn dies der Fall ist (z. B. wenn Sie die gesamte Ausgabe erhalten möchten und das Programm instabil ist), verwenden Sie std::endl .

317voto

Martin York Punkte 245363

Der Unterschied lässt sich wie folgt veranschaulichen:

std::cout << std::endl;

ist gleichbedeutend mit

std::cout << '\n' << std::flush;

Also,

  • Utilice std::endl Wenn Sie einen sofortigen Flush zur Ausgabe erzwingen wollen.
  • Utilice \n wenn Sie sich Sorgen um die Leistung machen (was wahrscheinlich nicht der Fall ist, wenn Sie die << Operator).

を使用しています。 \n auf den meisten Strecken.
Dann verwenden Sie std::endl am Ende eines Absatzes (aber das ist nur eine Gewohnheit und normalerweise nicht notwendig).

Im Gegensatz zu anderen Behauptungen ist die \n Zeichen wird nur dann der korrekten Plattform-Zeilenendesequenz zugeordnet, wenn der Datenstrom in eine Datei geht ( std::cin y std::cout die zwar etwas Besonderes sind, aber dennoch Dateien (oder dateiähnliche Dateien) darstellen).

52voto

Martin Beckett Punkte 92477

Es könnte zu Leistungsproblemen kommen, std::endl erzwingt ein Flush des Ausgabestroms.

43voto

Nathan Punkte 337

Es gibt einen weiteren Funktionsaufruf, wenn Sie die Funktion std::endl

a) std::cout << "Hello\n";
b) std::cout << "Hello" << std::endl;

a) ruft den Betreiber an << einmal.
b) ruft den Betreiber an << zweimal.

39voto

Emily L. Punkte 5324

Ich habe mich daran erinnert, dass ich darüber im Standard gelesen habe, also los geht's:

Siehe C11-Standard, der definiert, wie sich die Standard-Streams verhalten. Da C++-Programme eine Schnittstelle zum CRT haben, sollte der C11-Standard hier die Spülpolitik bestimmen.

ISO/IEC 9899:201x

7.21.3 §7

Beim Programmstart sind drei Textströme vordefiniert und müssen nicht explizit geöffnet werden - Standardeingabe (zum Lesen konventioneller Eingaben), Standardausgabe (zum Schreiben konventionelle Ausgabe) und Standardfehler (zum Schreiben von Diagnoseausgaben). Als anfänglicher geöffnet ist, ist der Standardfehlerstrom nicht vollständig gepuffert; der Standardeingabe- und der Standard Ausgabestreams sind nur dann vollständig gepuffert, wenn festgestellt werden kann, dass sich der Stream nicht auf ein auf ein interaktives Gerät verweist.

7.21.3 §3

Wenn ein Stream ungepuffert ist, sollen die Zeichen von der Quelle oder am Ziel so schnell wie möglich erscheinen. Andernfalls werden die Zeichen möglicherweise akkumuliert und und als Block zur oder von der Host-Umgebung übertragen werden. Wenn ein Datenstrom vollständig gepuffert ist, sollen die Zeichen als Block an die Host-Umgebung übertragen werden, wenn ein Puffer ein Puffer gefüllt ist. Wenn ein Datenstrom zeilengepuffert ist, sollen die Zeichen Zeichen als Block an die oder von der Host-Umgebung übertragen werden, wenn ein Zeilenwechselzeichen angetroffen wird. Außerdem sollen die Zeichen als Block an die Host-Umgebung übertragen werden Umgebung als Block übertragen werden, wenn ein Puffer gefüllt ist, wenn eine Eingabe auf einem ungepufferten Stream angefordert wird oder wenn eine Eingabe in einem zeilengepufferten Datenstrom angefordert wird, der die Übertragung von Zeichen aus der Host-Umgebung erfordert. Die Unterstützung für diese Merkmale ist implementierungsabhängig und kann über die Funktionen setbuf und setvbuf beeinflusst werden.

Dies bedeutet, dass std::cout y std::cin sind vollständig gepuffert wenn und nur wenn sie beziehen sich auf ein nicht interaktives Gerät. Mit anderen Worten: Wenn stdout an ein Terminal angeschlossen ist, gibt es keinen Unterschied im Verhalten.

Wenn jedoch std::cout.sync_with_stdio(false) aufgerufen wird, dann '\n' führt auch bei interaktiven Geräten nicht zu einer Spülung. Andernfalls '\n' ist gleichbedeutend mit std::endl es sei denn, sie werden in Dateien gespeichert: c++ ref auf std::endl .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X