sistema (“pausa”); – Por que isso está errado?

Aqui está uma pergunta que eu não entendi muito bem:

O comando, system("pause"); é ensinado a novos programadores como uma maneira de pausar um programa e esperar que uma input de teclado continue. No entanto, parece ser desaprovado por muitos programadores veteranos como algo que não deve ser feito em graus variados.

Algumas pessoas dizem que é bom usar. Alguns dizem que é apenas para ser usado quando você está trancado em seu quarto e ninguém está assistindo. Alguns dizem que eles vão pessoalmente para sua casa e matam você se você usá-lo.

Eu, sou um novo programador sem treinamento em programação formal. Eu uso porque fui ensinado a usá-lo. O que eu não entendo é que, se não é algo para ser usado, então por que fui ensinado a usá-lo? Ou, por outro lado, afinal não é tão ruim assim?

Quais são seus pensamentos sobre este assunto?

   

Ele é desaprovado porque é um hack específico da plataforma que não tem nada a ver com a programação de aprendizado, mas sim com um recurso do IDE / OS – a janela do console lançada do Visual Studio é fechada quando o programa termina a execução. o novo usuário não consegue ver a saída de seu novo programa.

Bodging in System (“pause”) executa o programa “pause” da linha de comandos do Windows e aguarda que ele termine antes de continuar a execução do programa – a janela do console permanece aberta para que você possa ler a saída.

Uma idéia melhor seria colocar um ponto de interrupção no final e depurá-lo, mas isso novamente tem problemas.

É lento. Depende da plataforma. É inseguro.

Primeiro: o que isso faz. Chamar “sistema” é literalmente como digitar um comando no prompt de comando do Windows. Há uma tonelada de configuração e desassembly para o seu aplicativo fazer essa chamada – e a sobrecarga é simplesmente ridícula.

E se um programa chamado “pause” fosse colocado no PATH do usuário? Apenas chamar system (“pause”) apenas garante que um programa chamado “pause” seja executado (espero que você não tenha seu executável chamado “pause”!)

Simplesmente escreva sua própria function “Pause ()” que usa _getch. OK, com certeza, o _getch também depende da plataforma (note: ele está definido em “conio.h”) – mas é muito melhor do que system() se você está desenvolvendo no Windows e tem o mesmo efeito (embora seja sua responsabilidade fornecer o texto com cout ou assim).

Basicamente: por que introduzir tantos problemas potenciais quando você pode simplesmente adicionar duas linhas de código e uma inclusão e obter um mecanismo muito mais flexível?

  • lento: ele tem que passar por um monte de código desnecessário do Windows e um programa separado para uma operação simples
  • Não é portátil: depende do programa de pausa
  • não é bom estilo: fazer uma chamada do sistema só deve ser feito quando realmente necessário
  • mais digitação: Sistema (“pausa”) é maior que getchar ()

um simples getchar () deve funcionar bem.

Em resumo, ele tem que pausar a execução dos programas e fazer uma chamada de sistema e alocar resources desnecessários quando você estiver usando algo tão simples como cin.get (). As pessoas usam o sistema (“PAUSE”) porque querem que o programa espere até que ele pressione Enter para poder ver sua saída. Se você quiser que um programa espere pela input, existem funções embutidas para aquelas que também são de plataforma cruzada e menos exigentes.

Mais explicações neste artigo.

Usando o system("pause"); é Ungood Practice ™ porque

  • É completamente desnecessário .
    Para manter a janela do console do programa aberta no final quando você executá-lo a partir do Visual Studio, use Ctrl + F5 para executá-lo sem debugging, ou então coloque um ponto de interrupção na última chave direita } do main . Portanto, não há problema no Visual Studio. E, claro, nenhum problema quando você executá-lo a partir da linha de comando.

  • É problemático e chato
    quando você executa o programa a partir da linha de comando. Para execução interativa você tem que pressionar uma tecla no final sem qualquer propósito. E para uso em automação de alguma tarefa essa pause é muito indesejada!

  • Não é portátil.
    O Unix-land não possui um comando de pause padrão.

O comando pause é um comando cmd.exe interno e não pode ser substituído, como é erroneamente reivindicado em pelo menos uma outra resposta. Ou seja, não é um risco de segurança, e a afirmação de que os programas antivírus o diagnosticam como tal é tão duvidosa quanto a afirmação de replace o comando (afinal, um system chamada de programa C ++ está em posição de fazer tudo o que o interpretador de comandos pode fazer, e mais). Além disso, embora essa maneira de pausar seja extremamente ineficiente pelos padrões usuais da programação em C ++, isso não importa em nada no final do programa de um novato.

Assim, as alegações na horda de respostas antes disso não estão corretas, e a principal razão pela qual você não deve usar o system("pause") ou qualquer outro comando de espera no final da sua main , é o primeiro ponto acima: é completamente desnecessário, não serve absolutamente a nada, é muito bobo.

Você pode usar std::cin.get() da iostream :

 #include  // std::cout, std::cin using namespace std; int main() { do { cout < < '\n' << "Press the Enter key to continue."; } while (cin.get() != '\n'); return 0; } 

Além disso, system('pause') é lento e inclui um arquivo que você provavelmente não precisa: stdlib.h . É dependente da plataforma e na verdade chama um SO 'virtual'.

Porque não é portátil.

 pause 

é apenas um programa windows / dos, então este seu código não roda no linux. Além disso, o system não é geralmente considerado como uma maneira muito boa de chamar outro programa – geralmente é melhor usar CreateProcess ou fork ou algo similar.

Conforme listado nas outras respostas, há muitas razões que você pode encontrar para evitar isso. Tudo se resume a uma razão que torna o resto irrelevante. A function System() é inerentemente insegura / não confiável e não deve ser introduzida em um programa, a menos que seja necessário.

Para uma atribuição de aluno, essa condição nunca foi atendida e, por esse motivo, eu falharia uma atribuição sem executar o programa se uma chamada para esse método estivesse presente. (Isso ficou claro desde o início.)

Para mim, não faz sentido, em geral, esperar antes de sair sem motivo. Um programa que tenha feito seu trabalho deve simplesmente terminar e entregar seus resources de volta ao seu criador.

Também não se espera silenciosamente em um canto escuro após um dia de trabalho, esperando que alguém dê uma gorjeta no ombro.

Aqui está uma das razões pelas quais você não deve usá-lo: ele vai irritar a maioria dos programas antivírus em execução no Windows se você estiver passando o programa para outra máquina, porque é uma ameaça à segurança. Mesmo que seu programa consista apenas em um simples cout < < "hello world\n"; system("pause"); cout < < "hello world\n"; system("pause"); Ele é pesado em resources e o programa obtém access ao comando cmd, que é visto como uma ameaça.

o pro está usando sistema (“PAUSA”); enquanto cria as pequenas porções do seu programa é para depurá-lo você mesmo. Se você usá-lo para obter resultados de variables ​​antes durante e após cada processo que você está usando para garantir que eles estão funcionando corretamente.

Depois de testá-lo e movê-lo a todo vapor com o restante da solução, você deve remover essas linhas. é realmente bom ao testar um algoritmo definido pelo usuário e garantir que você esteja fazendo as coisas na ordem correta para os resultados desejados.

De maneira nenhuma você deseja usar isso em um aplicativo depois de testá-lo e ter certeza de que ele está funcionando corretamente. No entanto, permite que você acompanhe tudo o que está acontecendo enquanto acontece. Não o use para aplicativos de usuário final.

É tudo uma questão de estilo. É útil para debugging, mas, caso contrário, não deve ser usado na versão final do programa. Realmente não importa o problema de memory, porque tenho certeza de que aqueles caras que inventaram o sistema (“pausa”) estavam prevendo que ele seria usado com frequência. Em outra perspectiva, os computadores são limitados em sua memory para tudo o que usamos no computador de qualquer maneira e não representa uma ameaça direta, como a alocação dinâmica de memory, então eu recomendo isso para a debugging de código, mas nada mais.