Muitos livros em C ++ contêm código de exemplo como este ...
std::cout << "Test line" << std::endl;
... então eu sempre fiz isso também. Mas já vi muito código de desenvolvedores trabalhando como este:
std::cout << "Test line\n";
Existe um motivo técnico para preferir um ao outro, ou é apenas uma questão de estilo de codificação?
c++
coding-style
iostream
c++-faq
Head Geek
fonte
fonte
'\n'
.Respostas:
Os caracteres de final de linha variados não importam, supondo que o arquivo esteja aberto no modo de texto, que é o que você obtém, a menos que você peça binário. O programa compilado escreverá a coisa correta para o sistema compilado.
A única diferença é que
std::endl
libera o buffer de saída e'\n'
não. Se você não deseja que o buffer seja liberado com freqüência, use'\n'
. Se você o fizer (por exemplo, se quiser obter toda a saída e o programa for instável), usestd::endl
.fonte
::std::cerr
vez de,::std::cout
uma vez que é sem buffer e liberado a cada operação de saída.stderr
é por "erros". Pelo contrário, é para mensagens de diagnóstico fora da banda, se você desejar. Deveria ser possível dizer./prog > file
e armazenar apenas a verdadeira carga útil do programa, mas o programa pode gostar de gerar muito mais informações de status, mesmo em interação normal.A diferença pode ser ilustrada pelo seguinte:
é equivalente a
Assim,
std::endl
Se você deseja forçar uma descarga imediata na saída.\n
se estiver preocupado com o desempenho (o que provavelmente não é o caso se você estiver usando o<<
operador).Eu uso
\n
na maioria das linhas.Em seguida, use
std::endl
no final de um parágrafo (mas isso é apenas um hábito e geralmente não é necessário).Ao contrário de outras reivindicações, o
\n
caractere é mapeado para a sequência correta de fim de linha da plataforma somente se o fluxo estiver indo para um arquivo (std::cin
estd::cout
sendo especial, mas ainda arquivos (ou semelhantes a arquivos)).fonte
cout
está vinculado acin
, o que significa que, se você ler a entrada decin
,cout
será liberado primeiro. Mas se você deseja exibir uma barra de progresso ou algo sem ler a partircin
, é claro que a descarga é útil.operator<<
não tinha desempenho ou que alternativa usar para o desempenho? Por favor, aponte-me para algum material para entender melhor isso.sync_with_stdio(false)
e não libere sua saída continuamente. Deixe a biblioteca decidir quando fazê-lo. stackoverflow.com/a/1926432/14065sync_with_stdio
torna os iostreams tão rápidos quanto o stdio. NãoPode haver problemas de desempenho,
std::endl
força a liberação do fluxo de saída.fonte
Há outra chamada de função implícita lá, se você for usar
std::endl
a) chama o operador
<<
uma vez.b) chama o operador
<<
duas vezes.fonte
std::cout << "Hello" << "\n";
?<<
seriam também 2 no caso a , portanto, eu não reivindicaria a necessidade de uma ou duas<<
(ou duas chamadas de função em geral). diferença entre\n
eendl
.Lembrei-me de ler sobre isso no padrão, então aqui vai:
Consulte o padrão C11, que define como os fluxos padrão se comportam. Como os programas C ++ fazem interface com a CRT, o padrão C11 deve governar a política de liberação aqui.
Isso significa que
std::cout
estd::cin
são totalmente armazenados em buffer se, e somente se , estiverem se referindo a um dispositivo não interativo. Em outras palavras, se stdout estiver conectado a um terminal, não haverá diferença no comportamento.No entanto, se
std::cout.sync_with_stdio(false)
for chamado,'\n'
não causará descarga mesmo em dispositivos interativos. Caso contrário,'\n'
é equivalente astd::endl
menos que o canal seja feito para os arquivos: c ++ ref on std :: endl .fonte
Ambos escreverão os caracteres de final de linha apropriados. Além desse endl, o buffer será confirmado. Você geralmente não deseja usar endl ao executar E / S de arquivo, porque as confirmações desnecessárias podem afetar o desempenho.
fonte
Não é grande coisa, mas o endl não funcionará no boost :: lambda .
fonte
Se você usa Qt e
endl
, você pode acidentalmente acabar usando um incorreto, oendl
que fornece resultados muito surpreendentes. Veja o seguinte trecho de código:Observe que eu escrevi em
endl
vez destd::endl
(o que estaria correto) e, aparentemente, há umaendl
função definida em qtextstream.h (que faz parte do QtCore).Usar em
"\n"
vez deendl
evitar completamente qualquer possível problema de espaço para nome. Este também é um bom exemplo de por que colocar símbolos no espaço para nome global (como o Qt faz por padrão) é uma má idéia.fonte
using namespace std;
? :-)using namespace std;
. É considerado uma má prática. Consulte Por que "usar o namespace std;" considerada má prática?Eu sempre tive o hábito de usar apenas std :: endl porque é fácil para mim ver.
fonte
O
std::endl
manipulador é equivalente a'\n'
. Masstd::endl
sempre libera o fluxo.fonte
Se você pretende executar seu programa em qualquer outra coisa que não seja o seu próprio laptop, nunca use a
endl
instrução. Especialmente se você estiver escrevendo muitas linhas curtas ou como eu já vi caracteres únicos em um arquivo. O uso deendl
é conhecido por eliminar sistemas de arquivos em rede como o NFS.fonte
Com referência Este é um manipulador de E / S somente de saída .
std::endl
Insere um caractere de nova linha na sequência de saída os e libera-o como se chamandoos.put(os.widen('\n'))
seguido deos.flush()
.Quando usar:
Este manipulador pode ser usado para produzir uma linha de saída imediatamente ,
por exemplo
Além disso
fonte