2009-07-10 19 views
97

He aquí una pregunta que yo no entiendo muy bien:sistema ("pausa"); - ¿Por qué está mal?

El comando, system("pause"); se enseña a los nuevos programadores como una manera de hacer una pausa en un programa y esperar una entrada de teclado para continuar. Sin embargo, parece ser desaprobado por muchos programadores veteranos como algo que no debería hacerse en diversos grados.

Algunas personas dicen que está bien usar. Algunos dicen que solo debe usarse cuando estás encerrado en tu habitación y nadie está mirando. Algunos dicen que irán personalmente a tu casa y te matarán si la usas.

Yo mismo soy un nuevo programador sin formación de programación formal. Lo uso porque me enseñaron a usarlo. Lo que no entiendo es que si no es algo para ser usado, ¿por qué me enseñaron a usarlo? O, por otro lado, ¿no es realmente tan malo después de todo?

¿Cuáles son sus pensamientos sobre este tema?

+0

relacionado: http://stackoverflow.com/questions/900666/system-calls-in-c-and-their-roles-in-programming –

+4

Aparentemente a la gente le gusta que sus llamadas se detengan para ser realmente eficientes. En otras palabras, "¡Date prisa y detente!" –

+43

Se lo enseñaron porque generalmente los profesores son malos programadores – wich

Respuesta

62

Está mal visto porque es un hack específico de la plataforma que no tiene nada que ver con aprender programación, sino una característica del IDE/OS: la ventana de la consola iniciada desde Visual Studio se cierra cuando el programa finaliza ejecución, por lo que el nuevo usuario no puede ver el resultado de su nuevo programa.

Bodging in System ("pausa") ejecuta el programa de "pausa" de línea de comandos de Windows y espera a que finalice antes de continuar la ejecución del programa - la ventana de la consola permanece abierta para que pueda leer la salida.

Una mejor idea sería poner un punto de interrupción al final y depurarlo, pero eso nuevamente tiene problemas.

+3

Visual Studio puede ejecutar el programa en dos modos: con o sin depuración. Cuando se ejecuta en modo de depuración se detendrá en el primer punto de interrupción. Si no tiene uno definido, ejecutará el programa y cerrará la consola. Por lo tanto, si desea que el programa de la consola se detenga, simplemente establezca un punto de interrupción o, mejor aún, ¡ejecútelo sin depuración! Eso ejecutará el programa y detendrá la consola. –

+0

Esto no es solo una característica de Visual Studio: si ejecuta un programa de consola desde Windows (es decir, en lugar de cargar un símbolo del sistema y ejecutarlo desde allí), también se cerrará cuando haya finalizado la ejecución. – JBentley

+2

** - 1 ** Re "la ventana de la consola iniciada desde Visual Studio se cierra cuando el programa ha finalizado la ejecución", no, solo cuando el programa se ejecuta en el depurador. Re "ejecuta la línea de comandos de Windows" pausa "programa", no hay tal ('pause' es un comando interno en' cmd.exe'). La lista de mejores ideas también está muy ausente. –

18

En resumen, tiene que pausar la ejecución de los programas y hacer una llamada al sistema y asignar recursos innecesarios cuando podría estar usando algo tan simple como cin.get(). La gente usa el sistema ("PAUSE") porque quieren que el programa espere hasta que presionen Enter para ver su salida. Si desea que un programa espere la entrada, hay funciones incorporadas para eso que también son multiplataforma y menos exigentes.

Explicación adicional en this artículo.

+0

¡Guau, otra vez! ¿vive usted aquí? lol De todos modos, gracias, voy a leer un poco. Mientras tanto, ¿cuáles son tus pensamientos sobre este asunto? – Faken

+0

Tuve esta misma pregunta cuando comencé C hace algunos años, y me señalaron ese mismo artículo. Yo uso getchar() personalmente. –

+0

Ho wow ... No he hecho C++ por un tiempo, pero sí ... definitivamente hay mejores formas de lograr los mismos resultados – Newtopian

8

Porque no es portátil.

pause 

es un programa solo para Windows/dos, por lo que este código no se ejecutará en Linux. Además, system generalmente no se considera una muy buena forma de llamar a otro programa; por lo general, es mejor usar CreateProcess o fork o algo similar.

32

Es lento. Es dependiente de la plataforma. Es inseguro.

Primero: Qué hace. Llamar a "sistema" es, literalmente, como escribir un comando en el símbolo del sistema de Windows. Hay una tonelada de configuración y desmontaje para su aplicación para realizar dicha llamada, y la sobrecarga es simplemente ridícula.

¿Qué pasa si un programa llamado "pausa" se colocó en la RUTA del usuario? Simplemente llamar al sistema ("pausa") solo garantiza que se ejecute un programa llamado "pausa" (¡espero que no tenga su ejecutable llamado "pausa"!)

Simplemente escriba su propia función "Pausa()" que usa _getch. OK, claro, _getch también depende de la plataforma (nota: está definido en "conio").h ") - pero es mucho mejor que system() si está desarrollando en Windows y tiene el mismo efecto (aunque es su responsabilidad proporcionar el texto con cout o más).

Básicamente: ¿por qué introducir tantos problemas potenciales? cuando se puede simplemente añadir dos líneas de código y uno incluir y tener un mecanismo mucho más flexible

+50

Para alguien quejándose de la dependencia de la plataforma, parece extraño sugerir '_getch', _especialmente_ cuando C++ estándar proporciona' getchar'. – paxdiablo

+25

siento algo de ironía al calcular los gastos generales para la interacción con un ser humano) – ShPavel

+0

Quizás no hayas oído hablar de los videojuegos. – orfdorf

21
  • lenta:? tiene que saltar a través de un montón de código innecesario Windows y un programa separado para un simple operación
  • no portátil: depende de el programa de pausa
  • no
  • buen estilo: hacer una llamada de sistema sólo se debe realiza cuando realmente necesaria
  • más escribiendo: Sistema ("pausa") es más largo que getchar()

un simple getchar() debería funcionar bien.

4

Como se enumeran en las otras respuestas, hay muchas razones que puede encontrar para evitar esto. Todo se reduce a una razón que hace que el resto sea discutible. La función System() es intrínsecamente insegura/no confiable, y no debe introducirse en un programa a menos que sea necesario.

Para una asignación de estudiante, esta condición nunca se cumplió, y por esta razón fallaría en una tarea sin siquiera ejecutar el programa si hubiera una llamada a este método. (Esto quedó en claro desde el principio.)

-3

Todo es cuestión de estilo. Es útil para la depuración, pero de lo contrario no debería usarse en la versión final del programa. Realmente no importa en el tema de la memoria porque estoy seguro de que los tipos que inventaron el sistema ("pausa") anticiparon que se usaría con frecuencia. En otra perspectiva, las computadoras se aceleran en su memoria para todo lo demás que usamos en la computadora de todos modos y no representa una amenaza directa como la asignación de memoria dinámica, así que lo recomendaría para depurar código, pero nada más.

+3

* Realmente no importa en el problema de la memoria porque estoy seguro de que los tipos que inventaron el sistema ("pausa") anticiparon que se usaría a menudo * realmente no tiene ningún sentido en absoluto. Nadie "inventó" esto, 'pause' fue diseñado para ser usado en programas por lotes de DOS, nunca fue pensado para ser usado de una manera como esta. Además, había alternativas mucho mejores antes de que alguien estuviera lo suficientemente loco como para escribir la frase 'system (" pause ");'. – wich

2

Para mí no tiene sentido en general esperar antes de salir sin razón. Un programa que ha hecho su trabajo debería terminar y devolver sus recursos a su creador.

Uno tampoco espera en silencio en un rincón oscuro después de un día de trabajo, esperando que alguien se incline sobre sus hombros.

+6

Esta es una respuesta tonta. Parte de un programa que "hace su trabajo" muestra los resultados de su trabajo al usuario. Por lo tanto, no debe finalizar hasta que el usuario le notifique que ha terminado con él. Un programa que desaparece de la pantalla del usuario un nanosegundo después de mostrar sus resultados, es inútil. – JBentley

+0

@JBentley: hablé de la situación _después_ mostrando los resultados, si corresponde. Para mostrar resultados, existen patrones apropiados, como señales, interrupciones, temporizadores, scrollback en su terminal, archivos. 'system (" pause ")' en sí mismo no muestra nada. Un programa de interfaz de línea de comando que no se invoca desde la línea de comando y se cierra demasiado pronto se invoca incorrectamente y con las opciones incorrectas, y usar 'system (" pause ")' para eludir un programa invocado erróneamente no es lo correcto. . –

+1

Quiero decir, imagina 'cat',' less', 'vi',' OpenOffice', 'Mathematica',' GNU Octave', ¿y si usaran 'system (" pause ")'? Eso sería molesto –

12

Puede utilizar std::cin.get() de iostream:

#include <iostream> // std::cout, std::cin 
using namespace std; 

int main() { 
    do { 
    cout << '\n' << "Press the Enter key to continue."; 
    } while (cin.get() != '\n'); 

    return 0; 
} 

Además, system('pause') es lento, e incluye un archivo es probable que no necesita: stdlib.h. Depende de la plataforma, y ​​en realidad llama a un sistema operativo "virtual".

+3

Me enseñaron a usar 'System (" pause ")' en un curso de programación de primer año, pero quería poder ejecutar mis programas en mi Mac, así que tuve que aprender sobre 'cin.get()'. – daviewales

0

He aquí una razón por la que no debes usarla: va a hacer enojar a la mayoría de los programas antivirus que se ejecutan en Windows si pasas el programa a otra máquina porque es una amenaza a la seguridad. Incluso si su programa solo consiste en un simple cout << "hello world\n"; system("pause"); es un recurso pesado y el programa obtiene acceso al comando cmd, que los virus ven como una amenaza.

-2

pro 'a usar el sistema ("PAUSA"); mientras que la creación de pequeñas porciones de su programa es para depurarlo usted mismo.si lo usa para obtener resultados de variables antes durante y después de cada proceso que está utilizando para garantizar que funcionen correctamente.

Después de probar y moverlo a toda máquina con el resto de la solución, debe eliminar estas líneas. es realmente bueno cuando se prueba un algoritmo definido por el usuario y se asegura de que se están haciendo las cosas en el orden correcto para los resultados que se desean.

De ninguna manera desea utilizar esto en una aplicación después de haberla probado y asegurarse de que está funcionando correctamente. Sin embargo, le permite hacer un seguimiento de todo lo que sucede a medida que sucede. No lo use para aplicaciones de usuario final.

12

Usando system("pause"); es una práctica Ungood ™ porque

  • Es completamente innecesario .
    Mantener ventana de la consola del programa abierto al final, cuando se ejecuta desde Visual Studio, utilice Ctrl +F5 para ejecutarlo sin depurar, o bien colocar un punto de interrupción en la última llave derecha } de main. Entonces, no hay problema en Visual Studio. Y, por supuesto, no hay ningún problema cuando lo ejecutas desde la línea de comando.

  • Es problemático & molesto
    cuando se ejecuta el programa desde la línea de comandos. Para la ejecución interactiva, debe presionar una tecla al final sin ningún propósito. ¡Y para el uso en la automatización de alguna tarea que pause es muy indeseable!

  • No es portátil.
    Unix-land no tiene un comando estándar pause.

El comando pause es un comando interno cmd.exe y no puede ser cambiada, como se afirma erróneamente en al menos una otra respuesta. Es decir. no es un riesgo de seguridad, y la afirmación de que los programas AV lo diagnostican como tal es tan dudoso como el reclamo de anular el comando (después de todo, un programa C++ que invoca system está en condiciones de hacer todo lo que el intérprete de comandos puede hacer, y Más). Además, aunque esta forma de pausar es extremadamente ineficiente según los estándares habituales de la programación en C++, eso no tiene importancia alguna al final del programa de un novato.

Por lo tanto, las reclamaciones de la horda de respuestas antes de esto no son correctos, y la razón principal por la que no deben usar system("pause")o cualquier otro comando de espera al final de su main, es el primer punto anterior: es completamente innecesario, no sirve para nada, es muy tonto.

+0

Algunas veces se necesita Ungood Practice ™ para realizar pruebas rápidas ... lo que llamamos "rápido y sucio" –

Cuestiones relacionadas