Pourquoi utiliser endl quand je peux utiliser un caractère de nouvelle ligne? [dupliquer]

Cette question a déjà une réponse ici:

Est-il une raison pour utiliser endl avec cout quand je peux utiliser n? Mon livre c++ dit d'utiliser endl, mais je ne vois pas pourquoi. Est-ce que n n'est pas supporté aussi largement que endl, ou est-ce que je manque quelque chose?

47
demandé sur PypeBros 2011-09-06 23:06:58

3 réponses

endl ajoute '\n' pour le stream et appels flush() sur le stream. Donc

cout << x << endl;

Est équivalent à

cout << x << '\n';
cout.flush();

Un flux peut utiliser un tampon interne qui est réellement diffusé lorsque le flux est vidé. Dans le cas de cout, vous ne remarquerez peut-être pas la différence car il est en quelque sorte synchronisé (lié) avec cin, mais pour un flux arbitraire, tel que file stream, vous remarquerez une différence dans un programme multithread, pour exemple.

Voici une discussion intéressante sur les raisons pour lesquelles le rinçage peut être nécessaire.

62
répondu Armen Tsirunyan 2011-09-06 19:13:05

endl est plus qu'un alias pour le caractère \n. Lorsque vous envoyez quelque chose à cout (ou à tout autre flux de sortie), il ne traite pas et ne produit pas les données immédiatement. Par exemple:

cout << "Hello, world!";
someFunction();

Dans l'exemple ci-dessus, il y a une certaine chance que l'appel de fonction commence à s'exécuter avant que la sortie ne soit vidée. En utilisant endl, vous forcez le vidage à avoir lieu avant l'exécution de la deuxième instruction. Vous pouvez également vous assurer qu'avec le ostream::flush fonction.

4
répondu Paul Manta 2011-09-06 19:13:42

Endl est une fonction pas un mot-clé.

#include <iostream>
int main()
{
 std::cout<<"Hello World"<<std::endl;  //endl is a function without parenthesis.
 return 0;
}   

Pour comprendre l'image de endl, vous devez d'abord comprendre le sujet "pointeur vers les fonctions".

Regardez ce code (en C)

#include <stdio.h>
int add(int, int);
int main()
{
   int (*p)(int, int); /*p is a pointer variable which can store the address    
   of a function whose return type is int and which can take 2 int.*/
   int x;

   p=add;                     //Here add is a function without parenthesis.

   x=p(90, 10); /*if G is a variable and Address of G is assigned to p then     
   *p=10 means 10 is assigned to that which p points to, means G=10                        
   similarly x=p(90, 10); this instruction simply says that p points to add    
   function then arguments of p becomes arguments of add i.e add(90, 10)   
   then add function is called and sum is computed.*/  

   printf("Sum is %d", x);
   return 0;
}
int add(int p, int q)
{
  int r;
  r=p+q;
  return r;
}

Compilez ce code et voyez la sortie.

Retour au sujet...

 #include <iostream>
 //using namespace std; 
 int main()
 {
 std::cout<<"Hello World"<<std::endl;
 return 0;
 }

Le fichier Iostream est inclus dans ce programme car le prototype de l'objet cout est présent dans le fichier iostream et std est un espace de noms. Il est utilisé parce que defination (fichiers de bibliothèque) de cout et endl est présent dans l'espace de noms std; Ou vous pouvez également utiliser "using namespace std" en haut, de sorte que vous n'avez pas à écrire " std:: coutn

Lorsque vous écrivez endl sans paranthèse, vous donnez l'adresse de la fonction endl à cout, puis la fonction endl est appelée et la ligne est modifiée. La raison derrière cela est

namespace endl
{
printf("\n");
}

Conclusion: derrière C++, le code de C fonctionne.

-1
répondu user8175502 2017-06-17 10:28:03