Wiele książek w C ++ zawiera taki przykładowy kod ...
std::cout << "Test line" << std::endl;
... więc zawsze to robiłem. Ale zamiast tego widziałem dużo kodu od takich programistów:
std::cout << "Test line\n";
Czy istnieje techniczny powód, aby preferować jeden nad drugim, czy to tylko kwestia stylu kodowania?
c++
coding-style
iostream
c++-faq
Head Geek
źródło
źródło
'\n'
.Odpowiedzi:
Różne znaki końca linii nie mają znaczenia, przy założeniu, że plik jest otwarty w trybie tekstowym, co otrzymasz, chyba że poprosisz o plik binarny. Skompilowany program wypisze poprawną rzecz dla skompilowanego systemu.
Jedyną różnicą jest to, że
std::endl
opróżnia bufor wyjściowy, a'\n'
nie. Jeśli nie chcesz, aby bufor był często opróżniany, użyj'\n'
. Jeśli tak (na przykład, jeśli chcesz uzyskać wszystkie dane wyjściowe, a program jest niestabilny), użyjstd::endl
.źródło
::std::cerr
zamiast,::std::cout
ponieważ jest niebuforowane i opróżniane przy każdej operacji wyjściowej.stderr
to „błędy”. Raczej jest to dla komunikatów diagnostycznych poza pasmem, jeśli chcesz. Powinno być możliwe powiedzenie./prog > file
i zapisanie tylko prawdziwego ładunku programu, ale program może chcieć wyświetlać znacznie więcej informacji o stanie, nawet podczas normalnej interakcji.Różnicę można zilustrować następująco:
jest równa
Więc,
std::endl
Jeśli chcesz wymusić natychmiastowe wyrównanie do wyjścia.\n
jeśli martwisz się wydajnością (co prawdopodobnie nie ma miejsca w przypadku korzystania z<<
operatora).Używam
\n
na większości linii.Następnie użyj
std::endl
na końcu akapitu (ale to tylko nawyk i zwykle nie jest konieczny).W przeciwieństwie do innych twierdzeń,
\n
znak jest odwzorowany na prawidłową sekwencję końca linii na platformie tylko wtedy, gdy strumień przechodzi do pliku (std::cin
istd::cout
jest specjalnym, ale nadal plikiem (lub podobnym do pliku)).źródło
cout
jest powiązany z tymcin
, co oznacza, że jeśli przeczytasz dane wejściowecin
,cout
najpierw zostaną usunięte. Ale jeśli chcesz wyświetlić pasek postępu lub coś bez czytania zcin
, to na pewno opróżnianie jest przydatne.operator<<
to nie jest wydajne, ani jakiej alternatywy dla wydajności? Proszę wskazać mi jakiś materiał, aby lepiej to zrozumieć.sync_with_stdio(false)
i nie opróżniaj swoich wyników w sposób ciągły. Niech biblioteka obliczy, kiedy to zrobić. stackoverflow.com/a/1926432/14065sync_with_stdio
sprawia , że iostreams jest tak szybki, jak Stdio. Nie robi tegoMogą występować problemy z wydajnością,
std::endl
wymuszają opróżnianie strumienia wyjściowego.źródło
Istnieje sugerowane inne wywołanie funkcji, jeśli zamierzasz użyć
std::endl
a)
<<
jeden raz dzwoni do operatora .b)
<<
dwukrotnie wzywa operatora .źródło
std::cout << "Hello" << "\n";
?<<
byłoby również 2 w przypadku a , więc nie twierdziłbym, że potrzeba jednego lub dwóch<<
(lub ogólnie dwóch wywołań funkcji) różnica między\n
iendl
.Przypomniałem sobie o czytaniu o tym w standardzie, więc oto:
Zobacz standard C11, który określa, jak zachowują się standardowe strumienie, ponieważ programy C ++ łączą CRT, standard C11 powinien tutaj rządzić polityką opróżniania.
Oznacza to, że
std::cout
istd::cin
są w pełni buforowane tylko wtedy, gdy są one nawiązujące do nieinterakcyjnym urządzenia. Innymi słowy, jeśli stdout jest podłączony do terminala, nie ma różnicy w zachowaniu.Jednak jeśli
std::cout.sync_with_stdio(false)
zostanie wywołany,'\n'
nie spowoduje koloru nawet w przypadku urządzeń interaktywnych. W przeciwnym razie'\n'
jest to równoważne zstd::endl
wyjątkiem przesyłania potokowego do plików: c ++ ref on std :: endl .źródło
Obaj napiszą odpowiednie znaki końca wiersza. Oprócz tego endl spowoduje, że bufor zostanie zatwierdzony. Zazwyczaj nie chcesz używać Endl podczas wykonywania operacji we / wy pliku, ponieważ niepotrzebne zatwierdzenia mogą wpływać na wydajność.
źródło
Nie jest to wielka sprawa, ale endl nie będzie działał w trybie boost :: lambda .
źródło
Jeśli użyjesz Qt i
endl
, możesz przypadkowo skończyć się niepoprawnym,endl
co daje bardzo zaskakujące wyniki. Zobacz następujący fragment kodu:Zauważ, że napisałem
endl
zamiaststd::endl
(co byłoby poprawne) i najwyraźniej istniejeendl
funkcja zdefiniowana w qtextstream.h (która jest częścią QtCore).Używanie
"\n"
zamiastendl
całkowicie pomija wszelkie potencjalne problemy z przestrzenią nazw. Jest to również dobry przykład, dlaczego umieszczanie symboli w globalnej przestrzeni nazw (jak domyślnie Qt) jest złym pomysłem.źródło
using namespace std;
? :-)using namespace std;
. Jest to uważane za złą praktykę. Zobacz, dlaczego „korzystanie z przestrzeni nazw std;” uważane za złą praktykę?Zawsze miałem zwyczaj używania std :: endl, ponieważ łatwo mi to zobaczyć.
źródło
std::endl
Manipulator jest równoważna'\n'
. Alestd::endl
zawsze opróżnia strumień.źródło
Jeśli zamierzasz uruchomić program na czymkolwiek innym niż na własnym laptopie, nigdy nie używaj tego
endl
oświadczenia. Zwłaszcza jeśli piszesz dużo krótkich linii lub jak często widziałem pojedyncze znaki w pliku. Używanieendl
jest znane do zabijania sieciowych systemów plików, takich jak NFS.źródło
Z odniesieniem Jest to manipulator we / wy tylko wyjściowy .
std::endl
Wstawia znak nowej linii do sekwencji wyjściowej os i opróżnia go, jakby wywoływał,os.put(os.widen('\n'))
a następnieos.flush()
.Kiedy użyć:
Tego manipulatora można użyć do natychmiastowego wygenerowania linii wyjściowej ,
na przykład
Również
źródło