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

Y a-t-il une raison d’utiliser endl avec cout alors que je peux simplement 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 quelque chose me manque?

endl ajoute '\n' au stream et appelle flush() sur le stream. Alors

 cout << x << endl; 

est équivalent à

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

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

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

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

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

Dans l'exemple ci-dessus, il est possible que l'appel de la fonction commence à s'exécuter avant que la sortie ne soit vidée. En utilisant endl vous forcez le flush avant que la deuxième instruction ne soit exécutée. Vous pouvez également vous en assurer avec la fonction ostream::flush .

endl est une fonction et non un mot clé.

 #include  int main() { std::cout<<"Hello World"< 

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

regarde ce code (en C)

 #include  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 ie 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; } 

Comstackz ce code et consultez la sortie.

Retour au sujet ...

  #include  //using namespace std; int main() { std::cout<<"Hello World"< 

Le fichier iostream est inclus dans ce programme car le prototype de l'object cout est présent dans le fichier iostream et std est un espace de noms. Il est utilisé car la définition (fichiers de bibliothèque) de cout et endl est présente dans namespace std; Ou vous pouvez également utiliser "using namespace std" en haut, vous n'avez donc pas besoin d'écrire "std :: coutn << ....." avant chaque cout ou endl.

lorsque vous écrivez endl sans paranthesis, 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.