Ouvi dizer que você deve evitar liderar novas linhas ao usar printf
. Para que, em vez de printf("\nHello World!")
você, useprintf("Hello World!\n")
Neste exemplo em particular acima, não faz sentido, pois a saída seria diferente, mas considere isso:
printf("Initializing");
init();
printf("\nProcessing");
process_data();
printf("\nExiting");
comparado com:
printf("Initializing\n");
init();
printf("Processing\n");
process_data();
printf("Exiting");
Não vejo nenhum benefício em seguir as novas linhas, exceto que parece melhor. Existe algum outro motivo?
EDITAR:
Vou abordar os votos próximos aqui e agora. Eu não acho que isso pertença ao estouro de pilha, porque esta pergunta é principalmente sobre design. Também gostaria de dizer que, embora possa ser opiniões a este assunto, a resposta de Kilian Foth e resposta de cmaster prova que há de fato benefícios muito objetivas com uma abordagem.
init()
eprocess_data()
imprima alguma coisa? Como você esperaria que o resultado se aparecesse?\n
é um terminador de linha , não um separador de linha . Isso é evidenciado pelo fato de que os arquivos de texto, no UNIX, quase sempre terminam\n
.Respostas:
Uma quantidade razoável de E / S do terminal é armazenada em buffer de linha ; portanto, encerrando uma mensagem com \ n, você pode ter certeza de que ela será exibida em tempo hábil. Com um \ n inicial, a mensagem pode ou não ser exibida de uma só vez. Freqüentemente, isso significa que cada etapa exibe a mensagem de progresso da etapa anterior , o que não causa confusão e desperdiça tempo ao tentar entender o comportamento de um programa.
fonte
fprintf(STDERR, …)
, em geral, que geralmente não é armazenado em buffer para saída de diagnóstico.Nos sistemas POSIX (basicamente qualquer linux, BSD, qualquer sistema baseado em código aberto que você puder encontrar), uma linha é definida como uma sequência de caracteres terminados por uma nova linha
\n
. Este é o pressuposto básico de todas as ferramentas de linha de comando padrão construir em cima, incluindo (mas não limitado a)wc
,grep
,sed
,awk
, evim
. Essa também é a razão pela qual algum editor (comovim
) sempre adiciona um\n
no final de um arquivo e por que os padrões anteriores de C exigiam que os cabeçalhos terminassem com um\n
caractere.Btw: Ter
\n
linhas finalizadas facilita muito o processamento de texto: você tem certeza de que possui uma linha completa quando possui esse terminador. E você tem certeza de que precisa procurar mais personagens se ainda não encontrou esse terminador.Obviamente, isso ocorre no lado de entrada dos programas, mas a saída do programa é frequentemente usada como entrada de programa novamente. Portanto, sua saída deve seguir a convenção, a fim de permitir uma entrada direta em outros programas.
fonte
Além do que outros já mencionaram, sinto que há uma razão muito mais simples: é o padrão. Sempre que algo é impresso em STDOUT, quase sempre assume que ele já está em uma nova linha e, portanto, não precisa iniciar uma nova. Ele também pressupõe que a próxima linha a ser escrita funcionará da mesma maneira e, portanto, termina de maneira útil iniciando uma nova linha.
Se você produzir linhas de linha de frente principais entrelaçadas com linhas de linha de fuga à linha padrão ", ela terá a seguinte aparência:
... o que presumivelmente não é o que você deseja.
Se você usar apenas as novas linhas principais no seu código e executá-lo apenas em um IDE, pode ser que isso aconteça. Assim que você executá-lo em um terminal ou introduzir o código de outras pessoas que gravará no STDOUT ao lado do seu código, você verá resultados indesejáveis, como acima.
fonte
$PS1
, o que seria irritante após os programas convencionais.Como as respostas altamente votadas já deram excelentes razões técnicas pelas quais as novas linhas finais devem ser preferidas, abordarei isso de outro ângulo.
Na minha opinião, os itens a seguir tornam um programa mais legível:
Pelos pontos acima, podemos argumentar que as novas linhas à direita são melhores. As novas linhas estão formatando "ruído" quando comparadas à mensagem, a mensagem deve se destacar e, portanto, deve vir em primeiro lugar (o destaque da sintaxe também pode ajudar).
fonte
"ok\n"
é muito melhor do que"\nok"
..."\pFoobar"
.O uso de novas linhas finais simplifica as modificações posteriores.
Como um exemplo (muito trivial) baseado no código do OP, suponha que você precise produzir alguma saída antes da mensagem "Inicializando", e essa saída venha de uma parte lógica diferente do código, em um arquivo de origem diferente.
Quando você executa o primeiro teste e descobre que "Inicializando" agora é anexado ao final de uma linha de alguma outra saída, você precisa pesquisar o código para descobrir onde ele foi impresso e depois esperar alterar "Inicializando" para "\ nInicializar "não estraga o formato de outra coisa, em circunstâncias diferentes.
Agora, considere como lidar com o fato de que sua nova saída é realmente opcional; portanto, sua alteração em "\ nInicialização" às vezes produz uma linha em branco indesejada no início da saída ...
Você define um sinalizador global ( horror de choque ?? !!! ) dizendo se havia alguma saída anterior e o testa para imprimir "Inicializando" com um \ n "\ n" inicial opcional, ou você gera o "\ n" junto com sua saída anterior e deixar futuros leitores de código se perguntando por que essa "Inicialização" não tem um \ n "\ n" à esquerda, como todas as outras mensagens de saída?
Se você produzir consistentemente novas linhas finais, no ponto em que você sabe que atingiu o final da linha que precisa ser encerrada, evite todos esses problemas. Observe que isso pode exigir uma declaração de puts separada ("\ n") no final de alguma lógica que produza uma linha peça por peça, mas o ponto é que você gera a nova linha no primeiro local do código em que você sabe que precisa faça isso, não em outro lugar.
fonte
Corresponder de perto à especificação C.
A biblioteca C define uma linha como terminando com um caractere de nova linha
'\n'
.O código que grava dados como linhas corresponderá a esse conceito de biblioteca.
Re: última linha requer um caractere de nova linha final . Eu recomendo sempre escrever uma final
'\n'
na saída e tolerar sua ausência na entrada.Verificação ortográfica
Meu verificador ortográfico reclama. Talvez o seu também.
fonte
ispell.el
para lidar melhor com isso. Admito\t
que o problema era mais frequente , e isso poderia ser evitado simplesmente dividindo a sequência em vários tokens, mas era apenas um efeito colateral de um trabalho mais geral de "ignorar", para ignorar seletivamente partes não-texto do HTML ou corpos MIME de várias partes e partes de código que não sejam comentários. Eu sempre quis estendê-lo para alternar idiomas onde existem metadados apropriados (por exemplo,<p lang="de_AT">
ouContent-Language: gd
), mas nunca recebi um Round Tuit. E o mantenedor rejeitou meu patch completamente. :-(ispell.el
.As novas linhas principais geralmente tornam mais fácil escrever o código quando há condicionais, por exemplo,
(Mas, como foi observado em outro lugar, pode ser necessário liberar o buffer de saída antes de executar as etapas que levam muito tempo na CPU.)
Portanto, um bom argumento pode ser feito para as duas formas de fazê-lo, por mais que eu pessoalmente não goste de printf () e usaria uma classe personalizada para criar a saída.
fonte
"\nProcessing"
.printf
. E se você quisesse condicionalizar toda a linha "Inicializando"? Você precisaria incluir a linha "Procesing" nessa condição para saber se deveria prefixar uma nova linha ou não. Se houver outra impressão à frente e você precisar condicionar a linha "Processando", também precisará incluir a próxima impressão nessa condição para saber se deve prefixar outra linha de nova e assim por diante para cada impressão.if ((addr & 0x0F)==0) printf("\n%08X:", addr);
e adicionar incondicionalmente uma nova linha à saída no final, do que usar código separado para o cabeçalho de cada linha e a nova linha à direita.Novas linhas principais não funcionam bem com outras funções de biblioteca, nomeadamente
puts()
eperror
na biblioteca padrão, mas também qualquer outra biblioteca é provável que você usar.Se você deseja imprimir uma linha pré-escrita (constante, ou já formatada - por exemplo, com
sprintf()
), entãoputs()
é a opção natural (e eficiente). No entanto, não há comoputs()
terminar a linha anterior e escrever uma linha não terminada - ela sempre grava o terminador da linha.fonte