Система ( «пауза»); - Почему это не так?

Вот вопрос, который я не совсем понимаю:

Команда,system("pause"); преподается новым программистам как способ приостановить программу и ждать продолжения ввода с клавиатуры. Тем не менее, многие ветераны-программисты считают, что это не следует делать в той или иной степени.

Некоторые люди говорят, что это нормально. Некоторые говорят, что его можно использовать только тогда, когда вы заперты в своей комнате, и никто не смотрит. Некоторые говорят, что они лично придут к вам домой и убьют вас, если вы им воспользуетесь.

Я сам новый программист без формального обучения программированию. Я использую это, потому что меня учили использовать это. Я не понимаю, что если это не то, что нужно использовать, то почему меня научили это использовать? Или, с другой стороны, это действительно не так уж плохо в конце концов?

Что вы думаете об этом?

 wich19 окт. 2012 г., 08:59
Вас этому учили, потому что учителя вообще плохие программисты
 Michael18 окт. 2015 г., 19:54
@wich - полная чушь.
 Gordon Gustafson13 сент. 2010 г., 00:58
 Adi Inbar16 нояб. 2014 г., 20:40
Пожалуйста, прочитайте этот совет, задавая хорошие вопросы: [How to Ask], [Writing the perfect question].
 Lee Louviere18 июл. 2011 г., 20:41
Очевидно, что людям нравится, когда их призывы сделать паузу действительно эффективны. Другими словами, «поторопись и остановись!»

Ответы на вопрос(12)

slow: it has to jump through lots of unnecessary Windows code and a separate program for a simple operation not portable: dependent on the pause program not good style: making a System call should only be done when really necessary more typing: System("pause") is longer than getchar()

прежде чем выйти без причины. Программа, которая выполнила свою работу, должна просто завершиться и передать свои ресурсы своему создателю.

Кроме того, после рабочего дня молча не ждут в темном углу, ожидая, когда кто-то наклонит плечо.

 30 сент. 2013 г., 12:18
Я имею в виду, просто представьcat, less, vi, OpenOffice, Mathematica, GNU Octaveчто, если они будут использоватьsystem("pause")? Это было бы раздражающим.
 26 сент. 2013 г., 16:53
Это глупый ответ. Часть программы "выполняет свою работу" отображает результаты своей работы пользователю. Поэтому он не должен заканчиваться, пока пользователь не уведомит его о том, что с ним покончено. Программа, которая исчезает с экрана пользователя через наносекунду после отображения ее результатов, является бесполезной.
 30 сент. 2013 г., 16:20
@JBentley: Это верно, и я не могу быть неопределенным. Я добавил "без причины" на мою первую фразу.
 30 сент. 2013 г., 15:28
Да, это будет раздражать, но сейчас вы конкретно говорите о проблемахsystem("pause")в то время как ваш ответ говорит о «подождите, прежде чем выйти», что является гораздо более обобщенным понятием. Многие из приведенных вами примеров фактически «ждут перед выходом», пока пользователь не сообщит программе, что он хочет, чтобы она вышла. я согласна с тем чтоsystem("pause") это не хороший способ для достижения этого и что есть лучшие решения, но это не то, что говорит ваш ответ.
 30 сент. 2013 г., 12:15
@JBentley: я говорил о ситуацииafter отображение результатов, если таковые имеются. Для отображения результатов существуют соответствующие шаблоны, такие как сигналы, прерывания, таймеры, прокрутка в вашем терминале, файлы.system("pause") сам по себе ничего не отображает. Программа интерфейса командной строки, которая вызывается не из командной строки и закрывается слишком рано, вызывается неправильно и с неправильными параметрами, и используетsystem("pause") обойти неправильно вызванную программу - это действительно не то, что нужно делать.

но в противном случае его не следует использовать в окончательной версии программы. Это действительно не имеет значения для проблемы с памятью, потому что я уверен, что те парни, которые изобрели систему («пауза»), ожидали, что она будет использоваться часто. С другой стороны, компьютеры ограничивают свою память для всего остального, что мы используем на компьютере, и это не представляет прямой угрозы, такой как динамическое выделение памяти, поэтому я рекомендую его для отладки кода, но ничего больше.

 19 окт. 2012 г., 09:05
It really doesn't matter on the memory issue because I'm sure that those guys who invented the system("pause") were anticipating that it'd be used often на самом деле не имеет никакого смысла. Никто не "изобрел" этот,pause был разработан для использования в пакетных программах DOS, и никогда не предназначался для использования таким образом. Кроме того, были намного лучшие альтернативы, прежде чем кто-то когда-нибудь был достаточно сумасшедшим, чтобы напечатать фразуsystem("pause");.

в то время как создание небольших частей вашей программы для самостоятельной отладки. если вы используете его для получения результатов переменных до, во время и после каждого процесса, который вы используете, чтобы убедиться, что они работают должным образом.

После тестирования и приведения его в полное состояние вместе с остальным решением, вы должны удалить эти строки. это действительно хорошо при тестировании пользовательского алгоритма и уверенности в том, что вы делаете все в правильном порядке для получения желаемых результатов.

Вы ни в коем случае не хотите использовать это в приложении после того, как вы проверили его и убедились, что оно работает должным образом. Однако это позволяет вам отслеживать все, что происходит, как это происходит. Не используйте его вообще для приложений конечного пользователя.

есть много причин, чтобы избежать этого. Все сводится к одной причине, которая делает спор остальным.System() Функция по своей природе небезопасна / не заслуживает доверия и не должна вводиться в программу без необходимости.

Для студенческого задания это условие никогда не выполнялось, и по этой причине я не смог бы выполнить задание, даже не запустив программу, если присутствовал вызов этого метода. (Это было ясно с самого начала.)

он будет разозлить большинство антивирусных программ, работающих в Windows, если вы передаете программу на другой компьютер, потому что это угроза безопасности. Даже если ваша программа состоит только из простогоcout << "hello world\n"; system("pause"); Это ресурсоемкий ресурс, и программа получает доступ к команде cmd, которую антивирусы считают угрозой.

Решение Вопроса

потому что это хак для конкретной платформы, который не имеет ничего общего с фактически изучением программирования, а вместо этого обходит особенность IDE / OS - окно консоли, запускаемое из Visual Studio, закрывается, когда программа завершает выполнение и поэтому новый пользователь не может видеть выходные данные своей новой программы.

При загрузке системы («pause») запускается командная строка Windows «pause». Программа и ожидает его завершения, прежде чем продолжить выполнение программы - окно консоли остается открытым, так что вы можете прочитать вывод.

Лучшей идеей было бы поставить точку останова в конце и отладить ее, но это опять-таки имеет проблемы.

 10 мар. 2016 г., 09:19
−1 Re & # x201C; окно консоли, запущенное из Visual Studio, закрывается, когда программа завершает выполнение & # x201D ;, нет, только когда программа запускается в отладчике. Re & # x201C; запускает командную строку Windows & quot; pause & quot; программа & # x201D ;, нет там такого (pause это внутренняя команда вcmd.exe). Список лучших идей также сильно отсутствует.
 17 июл. 2013 г., 10:02
Visual Studio может запускать программу в двух режимах: с отладкой или без нее. При запуске в режиме отладки он остановится на первой точке останова. Если у вас его нет, он запустит программу и закроет консоль. Итак, если вы хотите, чтобы консольная программа остановилась, просто установите точку останова или, что еще лучше, запустите ее без отладки! Это запустит программу и остановит консоль.
 26 сент. 2013 г., 16:49
Это не только особенность Visual Studio - если вы запускаете консольную программу из Windows (то есть вместо загрузки командной строки и запускаете ее оттуда), она также закрывается после завершения выполнения.

он должен приостановить выполнение программ, сделать системный вызов и выделить ненужные ресурсы, когда вы можете использовать что-то такое простое, как cin.get (). Люди используют Систему («PAUSE»), потому что они хотят, чтобы программа ждала, пока они не нажмут ввод, чтобы они могли видеть свои результаты. Если вы хотите, чтобы программа ожидала ввода, для нее есть встроенные функции, которые также являются кроссплатформенными и менее требовательными.

Дальнейшее объяснение вэтот статья.

 10 июл. 2009 г., 07:04
Ого ... Я давно не занимался C ++, но да .. Есть определенно лучшие способы достижения тех же результатов.
 Faken10 июл. 2009 г., 06:38
Вау, ты снова! Вы живете здесь? lol В любом случае, спасибо, я немного прочту. В то же время, что ваши мысли по этому поводу?
 10 июл. 2009 г., 06:39
У меня был тот же вопрос, когда я впервые начал C несколько лет назад, и мне указали на ту же статью. Я использую getchar () лично.

system("pause"); плохая практика & # x2122; так как

It's completely unnecessary.
To keep the program's console window open at the end when you run it from Visual Studio, use Ctrl+F5 to run it without debugging, or else place a breakpoint at the last right brace } of main. So, no problem in Visual Studio. And of course no problem at all when you run it from the command line.

It's problematic & annoying
when you run the program from the command line. For interactive execution you have to press a key at the end to no purpose whatsoever. And for use in automation of some task that pause is very much undesired!

It's not portable.
Unix-land has no standard pause command.

pause команда является внутреннейcmd.exe команда и не может быть переопределена, как ошибочно заявлено по меньшей мере в одном другом ответе. То есть это не риск для безопасности, и утверждение о том, что AV-программы его диагностируют как таковое, столь же сомнительно, как утверждение о переопределении команды (в конце концов, вызов программы на C ++system в состоянии сделать все, что может сделать интерпретатор команд, и многое другое). Кроме того, хотя этот способ приостановки является чрезвычайно неэффективным по обычным стандартам программирования на C ++, это вообще не имеет значения в конце программы новичка.

Таким образом, претензии в орде ответов до этого не верны, и основная причина, по которой вы не должны использоватьsystem("pause") or any other wait command в конце вашегоmainЭто первый пункт выше: это совершенно не нужно, это не имеет абсолютно никакой цели, это просто очень глупо.

 11 янв. 2018 г., 20:04
Иногда плохая практика & # x2122; нужен для быстрых тестов .... то, что мы называем "быстрым и грязным"

Первое: что это делает. Вызов "системы" буквально похоже на ввод команды в командной строке Windows. Существует множество настроек и разрывов для вашего приложения, чтобы сделать такой вызов - и это просто смешно.

Что делать, если программа называется «пауза» был помещен в ПУТЬ пользователя? Просто вызов системы («pause») только гарантирует, что программа под названием «pause» выполняется (надеюсь, что у вас нет исполняемого файла с именем & quot; pause & quot ;!)

Просто напишите свой собственный & quot; Pause () & quot; функция, которая использует _getch. Хорошо, конечно, _getch также зависит от платформы (примечание: это определено в "conio.h"), но это намного лучше, чемsystem() если вы разрабатываете для Windows, и это имеет тот же эффект (хотя вы обязаны предоставить текст cout или около того).

По сути: зачем создавать так много потенциальных проблем, когда вы можете просто добавить две строки кода и одну строку включения и получить гораздо более гибкий механизм?

 11 янв. 2018 г., 23:55
−1 & # x201C; Что делать, если программа называется "pause"? был помещен в пользовательскую PATH? & # x201D; это очень вводящий в заблуждение вопрос. Это основано на фантазии о том, как все работает. Автор не имеетtried это, но извергает свои собственные заблуждения без контроля.
 19 окт. 2012 г., 09:14
Для тех, кто жалуется на зависимость от платформы, довольно странно предлагать_getch, especially когда стандарт C ++ обеспечиваетgetchar.
 30 сент. 2013 г., 16:33
я чувствую некоторую иронию в расчете накладных расходов на взаимодействие с человеком)
 11 нояб. 2015 г., 06:01
@ Спагпанц: Возможно, вы не понимаете разницу между получением информации от человека и генерацией изображений и звуковat человек.
 13 янв. 2018 г., 05:06
@nlaq: Вы можете запустить программу под названиемpause используя точное имя файла, например,pause.bat, Предположительно это то, что вы неправильно истолковали 8 лет назад. Ваш ответ - мусор: вы должныtry вещи перед утверждением фактов фантазии, особенно в продолжение примечания, говорящего Вам, что Вы не сделали этого ранее. Ваше поведение, просто утверждая что-то и размышляя о фантазии, является обычным делом для читателей Stack Overflow. Я не знаю, как вас обучить. Я всегда терпел неудачу в этом здесь, на SO. Я извиняюсь.

Потому что это не портативный.

pause

это программа только для Windows / DOS, так что ваш код не будет работать на Linux. Более того,system обычно не считается очень хорошим способом вызова другой программы - обычно лучше использоватьCreateProcess или жеfork или что-то подобное.

std::cin.get() от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;
}

Кроме того,system('pause') работает медленно и включает файл, который вам, вероятно, не нужен:stdlib.h, Это зависит от платформы и фактически вызывает «виртуальный»; ОПЕРАЦИОННЫЕ СИСТЕМЫ.

 14 окт. 2014 г., 06:08
Меня учили пользоватьсяSystem("pause") на первом курсе по программированию, но я хотел иметь возможность запускать свои программы на моем Mac, поэтому мне пришлось узнать оcin.get().

Ваш ответ на вопрос