732 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' .

23voto

Ferruccio Punkte 96076

Sie schreiben beide das/die entsprechende(n) Zeilenendezeichen. Darüber hinaus bewirkt endl, dass der Puffer festgeschrieben wird. Normalerweise sollten Sie endl bei Dateieingaben nicht verwenden, da die unnötigen Übertragungen die Leistung beeinträchtigen können.

17voto

Özgür Punkte 7782

Keine große Sache, aber endl wird nicht funktionieren en boost::lambda .

(cout<<_1<<endl)(3); //error

(cout<<_1<<"\n")(3); //OK , prints 3

16voto

smerlin Punkte 6156

Wenn Sie Qt verwenden und endl könnten Sie versehentlich einen falschen Namen verwenden. endl was zu sehr überraschenden Ergebnissen führt. Siehe den folgenden Codeschnipsel:

#include <iostream>
#include <QtCore/QtCore> 
#include <QtGui/QtGui>

// notice that there is no "using namespace std;"
int main(int argc, char** argv)
{
    QApplication qapp(argc,argv);
    QMainWindow mw;
    mw.show();
    std::cout << "Finished Execution!" << endl;
    // This prints something similar to: "Finished Execution!67006AB4"
    return qapp.exec();
}

Anmerkung: Ich schrieb endl anstelle von std::endl (was korrekt gewesen wäre) und offenbar gibt es eine endl Funktion definiert in qtextstream.h (die Teil von QtCore ist).

Verwendung von "\n" anstelle von endl umgeht alle potenziellen Probleme mit Namensräumen. Dies ist auch ein gutes Beispiel dafür, warum es eine schlechte Idee ist, Symbole in den globalen Namespace zu stellen (wie es Qt standardmäßig tut).

12voto

TheHardew Punkte 319

Ich habe noch nie jemanden sagen sehen, dass '\n' wird durch die cout-Formatierung beeinflusst:

#include <iostream>
#include <iomanip>

int main() {
    std::cout << "\\n:\n" <<  std::setw(2) << std::setfill('0') << '\n';
    std::cout << "std::endl:\n" << std::setw(2) << std::setfill('0') << std::endl;
}

Ausgabe:

\n:
0
std::endl:

Beachten Sie, wie seit '\n' ein Zeichen ist und die Füllbreite auf 2 gesetzt ist, wird nur 1 Null gedruckt, bevor '\n' .

Ich kann nirgends etwas darüber finden, aber es reproduziert sich mit clang, gcc und msvc.

Ich war sehr verwirrt, als ich es zum ersten Mal sah.

9voto

Kaleem Ullah Punkte 6183

Avec Referenz Dies ist ein Nur-Ausgabe-E/A-Manipulator .

std::endl Fügt ein Newline-Zeichen in die Ausgabesequenz os ein und spült sie, als ob durch den Aufruf os.put(os.widen('\n')) gefolgt von os.flush() .

Wann zu verwenden:

Dieser Manipulator kann verwendet werden, um eine Reihe von Ausgabe sofort ,

z.B..

bei der Anzeige von Ausgaben eines lang laufenden Prozesses, bei der Protokollierung von Aktivitäten mehrerer Threads oder bei der Protokollierung von Aktivitäten eines Programms, das unerwartet abstürzen kann.

Auch

Ein expliziter Flush von std::cout ist auch vor einem Aufruf von std::system erforderlich, wenn der gespawnte Prozess eine Bildschirm-E/A durchführt. In den meisten anderen üblichen interaktiven E/A-Szenarien ist std::endl überflüssig, wenn es zusammen mit std::cout verwendet wird, da jede Eingabe von std::cin, jede Ausgabe an std::cerr oder jeder Programmabbruch einen Aufruf von std::cout.flush() erzwingt. Verwendung von std::endl anstelle von ' \n ', die von einigen Quellen befürwortet wird, kann die Ausgangsleistung erheblich beeinträchtigen.

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