mid - substring c++
"/ N" o "/ n" o std:: endl a std:: cout? (6)
Esta pregunta ya tiene una respuesta aquí:
- C ++: "std :: endl" vs "/ n" 11 respuestas
std::endl
muchos años desde que paré de usar std::endl
en las líneas finales al escribir en std::cout
, y comencé a usar "/n"
lugar.
Pero ahora empiezo a ver más fragmentos de código usando ''/n''
lugar, y comencé a preguntarme qué podría ser mejor.
Además de lo obvio de que uno es una cadena y el otro un personaje, ¿hay alguna ventaja al usar esto?
std::cout << variable << ''/n'';
Más allá de esto:
std::cout << variable << "/n";
Adición tardía:
Cuando hice esta pregunta, parecí pensar que la línea nueva ''/n''
encendió el buffer. Ahora sé que depende .
De manera predeterminada, std::cin
está vinculado al flujo de C stdin
FILE*
, y std::cout
está vinculado a stdout
. La descarga en la nueva línea proviene de esta vinculación. Por defecto, stdout
, si está conectado a un terminal, está almacenado en la línea. Eso significa que una nueva línea vaciará sus buffers. Por lo tanto, al imprimir una nueva línea usando std::cout
, esto llevará a que stdout
se vacíe.
Si stdout
no está conectado a un terminal (por ejemplo, la salida ha sido redirigida o está canalizada), o si el vínculo entre std::cout
y stdout
está roto, las nuevas líneas no arrojarán nada.
Editar: redacté mal mi respuesta, lo que puede haber llevado a la gente a creer que, en realidad, "/ n" imprimió un carácter nulo. Esto, por supuesto, está mal :)
Edición 2: Después de haber consultado una referencia de C ++, las referencias se pasan por referencia de todos modos, por lo que no hay diferencia. La única diferencia es que la cstring deberá buscarse para un carácter delimitador. Lo siguiente no es correcto debido a este hecho.
''/n''
sería ligeramente más eficiente que "/n"
, porque este último también contiene un carácter nulo en el extremo, lo que significa que está enviando un char*
al operator<<()
(generalmente 4 bytes en un Sistema de 32 bits) en lugar de un solo byte para un char
.
En la práctica, esto es irrelevante en el límite. Personalmente, sigo la convención que describió Vladimir. *
Ellos hacen cosas diferentes. "/n"
genera una nueva línea (en la representación específica de la plataforma adecuada, por lo que genera un "/r/n"
en Windows), pero std::endl
hace lo mismo y vacía la transmisión . Por lo general, no necesita enjuagar la secuencia de inmediato y solo le costará rendimiento, por lo que en su mayor parte no hay ninguna razón para usar std::endl
.
En realidad, ''/n''
debería ser el predeterminado. A menos que también desee descargar explícitamente la transmisión (¿y cuándo y por qué querría hacer eso?), No es necesario usar std::endl
en absoluto. 1
Por supuesto, muchos libros y tutoriales usan std::endl
como el predeterminado. Eso es desafortunado y podría conducir a errores graves de rendimiento .
Supongo que hay poca diferencia entre usar ''/n''
o usar "/n"
, pero este último es una matriz de (dos) caracteres, que debe imprimirse carácter por carácter, para lo cual se debe configurar un ciclo, que es más complejo que generar un solo carácter. Por supuesto, cuando se hace IO esto rara vez importa, pero en caso de duda, cuando se desea generar un carácter literal, se emite un literal de carácter, en lugar de un literal de cadena completo.
Un buen efecto secundario de hacerlo es que te comunicas en tu código que intentabas dar salida a un solo personaje, y no solo accidentalmente lo hiciste.
1 Tenga en cuenta que std::cout
está vinculado a std::cin
de forma predeterminada, lo que lleva a std::cout
enjuagarse antes de cualquier operación de entrada, por lo que cualquier mensaje se imprimirá antes de que el usuario tenga que ingresar algo.
No hay los mejores Usas lo que necesitas:
- ''/ n'' - para finalizar la línea
- "some string / n" - al final de la línea después de una cadena
-
std::endl
- para finalizar la línea y vaciar la corriente
std::endl
la secuencia. Cuando desee que suceda algo de esto, por ejemplo, porque espera que su salida sea visible para el usuario de manera oportuna, debe usar std::endl
lugar de escribir ''/n''
en la transmisión (ya sea como un elemento aislado personaje o parte de una cadena).
A veces, puedes salir sin tirar el flujo de forma explícita; por ejemplo, en un entorno Linux, si cout
está sincronizado con STDOUT
(este es el valor predeterminado) y está escribiendo en un terminal, entonces de forma predeterminada, el flujo se almacenará en línea y se vaciará automáticamente cada vez que se escriba una nueva línea.
Sin embargo, es arriesgado confiar en este comportamiento. Por ejemplo, en el mismo entorno de Linux, si decide ejecutar su programa con stdout
siendo redireccionado a un archivo o canalizado a otro proceso, entonces, de forma predeterminada, la transmisión se bloqueará en bloque en su lugar.
De forma similar, si más adelante decide desactivar la sincronización con stdio (por ejemplo, para la eficiencia), las implementaciones tenderán a usar los mecanismos de almacenamiento en memoria intermedia de iostream
, que no tienen un modo de almacenamiento en línea.
He visto una gran pérdida de productividad debido a este error; si la salida debe ser visible cuando está escrita, entonces debe usar std::endl
explícitamente (o usar std::flush
o std::ostream::flush
, pero normalmente encuentro std::endl
más conveniente), o hacer otra cosa que asegura que el enjuague ocurre con la frecuencia suficiente, como configurar stdout
para que sea buffer de línea (suponiendo que sea adecuado).
std::cout << variable << std::endl;
std::endl
una nueva línea, pero también vacía el flujo de salida. En otras palabras, el mismo efecto questd::cout << variable << ''/n''; // output newline std::cout.flush(); // then flush
std::cout << variable << ''/n'';
''/n''
salida una nueva línea para unchar,
porostream& operator<< (ostream& os, char c);
tantochar,
ostream& operator<< (ostream& os, char c);
se utilizará.std::cout << variable << "/n";
"/n"
es unconst char[2]
, por lo queostream& operator<< (ostream& os, const char* s);
se utilizará. Podemos imaginar que esta función contendrá un bucle, podríamos argumentar que es excesivo simplemente imprimir una nueva línea.