sprintf_s sprintf sprinf snprintf ejemplo c++ string-formatting iostream buffering

c++ - sprintf - ¿Por qué usar endl cuando puedo usar un carácter de nueva línea?



sprintf_s c++ (3)

Esta pregunta ya tiene una respuesta aquí:

¿Hay alguna razón para usar endl con cout cuando puedo usar /n ? Mi libro de C ++ dice usar endl, pero no veo por qué. ¿No se soporta /n tan ampliamente como endl , o me estoy perdiendo algo?


endl es una función no una palabra clave.

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

Para comprender la imagen de endl, primero debe comprender el tema "Puntero a funciones".

mira este código (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; }

Compile este código y vea la salida.

Volver al tema ...

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

El archivo iostream se incluye en este programa porque el prototipo del objeto cout está presente en el archivo iostream y std es un espacio de nombres. Se usa porque la definición (archivos de biblioteca) de cout y endl está presente en namespace std; O también puede usar "using namespace std" en la parte superior, para no tener que escribir "std :: coutn << ....." antes de cada cout o endl.

cuando escribe endl sin paréntesis, da la dirección de la función endl a cout, luego se llama a la función endl y se cambia la línea. La razón detrás de esto es

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

Conclusión: Detrás de C ++, el código de C está funcionando.


endl agrega ''/n'' a la transmisión y llama a flush() en la transmisión. Asi que

cout << x << endl;

es equivalente a

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

Un flujo puede usar un búfer interno que se transmite cuando se descarga el flujo. En caso de cout es posible que no note la diferencia, ya que de alguna manera está sincronizada ( atada ) con cin , pero, por ejemplo, para una transmisión arbitraria, como la transmisión de archivos, notará una diferencia en un programa de multiproceso.

Here una discusión interesante sobre por qué puede ser necesario el lavado.


endl es más que un simple alias para el carácter /n . Cuando envía algo para cout (o cualquier otro flujo de salida), no procesa ni genera los datos inmediatamente. Por ejemplo:

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

En el ejemplo anterior, existe la posibilidad de que la llamada a la función comience a ejecutarse antes de que se vacíe la salida. Usando endl que la descarga tenga lugar antes de que se ejecute la segunda instrucción. También puede asegurarse de que con la función ostream::flush .