93 votes

" \n ou " \n ' ou std::endl vers std::cout ?

Cela fait maintenant de nombreuses années que j'ai arrêté d'utiliser std::endl pour terminer les lignes lors de l'écriture sur std::cout et a commencé à utiliser "\n" à la place.

Mais maintenant je commence à voir plus de bouts de code utilisant '\n' à la place, et j'ai commencé à me demander ce qui pourrait être le mieux.

Outre le fait évident que l'un est une chaîne de caractères et l'autre un caractère, y a-t-il un avantage à utiliser cette méthode ?

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

Par-dessus tout ça :

std::cout << variable << "\n";

Ajout tardif :

Lorsque j'ai posé cette question, il semblait penser que la nouvelle ligne '\n' a vidé le tampon. Maintenant, je sais qu'il dépend de .

Par défaut std::cin est lié à l'ancien C stdin FILE* et std::cout est lié à stdout . Le flushing sur newline provient de cette liaison. Par défaut stdout si elle est connectée à un terminal, est tamponnée en ligne. Cela signifie qu'une nouvelle ligne va vider ses tampons. Ainsi, lorsque vous imprimez une nouvelle ligne en utilisant std::cout qui conduira à stdout en cours de rinçage.

Si stdout n'est pas connecté à un terminal (par exemple la sortie a été redirigée ou est canalisée), ou si le lien entre std::cout y stdout est cassé, alors les nouvelles lignes n'effaceront rien.

1 votes

Question intéressante, j'aimerais aussi voir une réponse à cette question :) Par ailleurs, pourquoi avez-vous cessé d'utiliser std::endl ?

0 votes

1 votes

@Constantinius J'ai arrêté avec using namespace std y std::endl Il y avait trop de choses à écrire. :)

109voto

sbi Points 100828

En fait, '\n' devrait être la valeur par défaut. À moins que vous ne souhaitiez également vider le flux de manière explicite (et quand et pourquoi voudriez-vous le faire ?), il n'est pas nécessaire d'utiliser la commande std::endl du tout. 1
Bien sûr, de nombreux livres et tutoriels utilisent std::endl par défaut. C'est regrettable et cela pourrait conduire à de graves problèmes de performance .

Je suppose qu'il y a peu de différence entre utiliser '\n' ou en utilisant "\n" mais ce dernier est un tableau de (deux) caractères, qui doit être imprimé caractère par caractère, ce qui nécessite la mise en place d'une boucle, plus complexe que la sortie d'un seul caractère. Bien sûr, lorsque l'on fait des entrées-sorties, cela a rarement de l'importance, mais en cas de doute, lorsque vous voulez sortir un littéral de caractère, sortez un littéral de caractère, plutôt qu'une chaîne de caractères entière.
Un effet secondaire agréable de cette façon est que vous communiquez dans votre code que vous prévu pour ne sortir qu'un seul caractère, et n'a pas fait ça par accident.


1 Notez que <code>std::cout</code> est lié à <code>std::cin</code> par défaut, ce qui conduit à <code>std::cout</code> avant toute opération de saisie, de sorte que toute invite sera imprimée avant que l'utilisateur n'ait à saisir quelque chose.

0 votes

'\n' peut, dans certaines situations, être vraiment plus rapide de manière mesurable que "\n" . On devrait donc avoir l'habitude de l'utiliser, mais bien sûr, quand on veut qu'il fasse partie d'une chaîne de caractères "foobar\n" est la voie à suivre. Il pourrait également être judicieux -- lorsque votre implémentation fournit un moyen -- d'activer l'autoflush pour les fichiers \n ce qui accélérera encore plus certaines choses. Pour rendre les choses rondes, std::cerr n'est pas bufferisée et il n'y a pas vraiment de différence dans ce cas, mais pour les std::clog il y a bien sûr.

1 votes

Par contre, si vous voulez indiquer la progression en affichant "...", vous pouvez appeler flush après chaque '.' !

0 votes

@curiousguy : Oui, c'est un exemple valide pour quand vous voulez vraiment vider le flux. Mais ces cas sont rares.

15voto

BЈовић Points 28674

Il n'y a pas de meilleurs. Vous utilisez ce dont vous avez besoin :

  • ' \n ' - pour terminer la ligne
  • "une chaîne \n " - la fin de la ligne après une chaîne de caractères
  • std::endl - pour terminer la ligne et vider le flux

14voto

jalf Points 142628

Ils font des choses différentes. "\n" produit un saut de ligne (dans la représentation spécifique à la plate-forme appropriée, de sorte qu'il génère un message "\r\n" sur Windows), mais std::endl fait la même chose et jette le courant . En général, vous n'avez pas besoin de vider le flux immédiatement et cela vous coûterait de la performance, donc la plupart du temps, il n'y a aucune raison d'utiliser la fonction std::endl .

4voto

Chris Parton Points 714

Edit : J'ai mal formulé ma réponse, ce qui a pu laisser croire que je pensais " \n " a en fait imprimé un caractère nul. C'est bien sûr faux :)

Edit 2 : Après avoir regardé une référence C++, char sont passés par référence de toute façon, il n'y a donc aucune différence. La seule différence est que la cstring devra être recherchée pour un caractère de délimitation. Le texte ci-dessous n'est pas correct en raison de ce fait.

'\n' serait un tout petit peu plus efficace que "\n" car cette dernière contient également un caractère nul à la fin, ce qui signifie que vous envoyez un message char* a operator<<() (généralement 4 octets sur un système 32 bits) par opposition à un seul octet pour une char .

En pratique, c'est à la limite du non pertinent. Personnellement, je suis la convention que Vladimir a exposée.*

0 votes

Parce que c'est mal ? Pourquoi est-ce que \n générer un caractère nul ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X