Система ( «пауза»); – Почему это неправильно?

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

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

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

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

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

12 Solutions collect form web for “Система ( «пауза»); – Почему это неправильно?”

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

Bodging in System («пауза») запускает программу «пауза» в командной строке Windows и ждет ее завершения до того, как она продолжит выполнение программы – окно консоли остается открытым, чтобы вы могли прочитать результат.

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

Это медленно. Это зависит от платформы. Это небезопасно.

Во-первых: что он делает. Вызов «системы» буквально напоминает ввод команды в командной строке Windows. Для вашего приложения есть тонна настроек и parsingки, и накладные расходы просто смешные.

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

Просто напишите собственную функцию «Pause ()», которая использует _getch. ОК, конечно, _getch также зависит от платформы (примечание: оно определено в «conio.h») – но это намного лучше, чем system() если вы разрабатываете Windows, и это имеет тот же эффект (хотя вы несете ответственность за укажите текст cout или так).

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

  • медленно: он должен перепрыгнуть через много ненужного кода Windows и отдельную программу для простой операции
  • не переносимый: в зависимости от программы паузы
  • не хороший стиль: сделать системный вызов нужно только тогда, когда это действительно необходимо
  • более типизация: система («пауза») длиннее, чем getchar ()

простой getchar () должен отлично работать.

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

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

Использование system("pause"); это Ungood Practice ™, потому что

  • Это совершенно не нужно .
    Чтобы окно консоли было открыто в конце, когда вы запускаете его из Visual Studio, используйте Ctrl + F5, чтобы запустить его без отладки, или поместите точку останова в последней правой скобке } main . Итак, никаких проблем в Visual Studio. И, конечно, никаких проблем при запуске из командной строки.

  • Это проблематично и раздражает
    когда вы запускаете программу из командной строки. Для интерактивного выполнения вы должны нажимать клавишу в конце без каких-либо целей. А для использования в автоматизации какой-то задачи эта pause очень нежелательна!

  • Это не переносимо.
    Unix-land не имеет стандартной команды pause .

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

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

Вы можете использовать std::cin.get() из 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; } 

Кроме того, system('pause') работает медленно и включает файл, который вам, вероятно, не нужен: stdlib.h . Он зависит от платформы и фактически вызывает «виртуальную» ОС.

Потому что он не переносимый.

 pause 

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

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

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

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

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

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

pro для использования системы («ПАУЗА»); в то время как создание небольших частей вашей программы предназначено для ее отладки самостоятельно. если вы используете его для получения результатов переменных до и после каждого процесса, который вы используете, чтобы убедиться, что они работают правильно.

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

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

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

  • Когда я должен создать деструктор?
  • Оператор Modulo с отрицательными значениями
  • Почему class enums предпочтительнее простого enums?
  • Как исправить «Точка останова в настоящее время не будет удалена. Для этого документа не были загружены символы. "Предупреждение?
  • Как автоматически генерировать stacktrace, когда моя программа gcc C ++ вылетает
  • Каков эффективный способ подсчета бит в позиции или ниже?
  • Как вы делаете глубокую копию объекта в .NET (например, C #)?
  • Как вызвать функцию родительского classа из производной функции classа?
  • Как отправить электронную почту через SSL SMTP с помощью .NET Framework?
  • Что такое size_t в C?
  • Является ли законным возвращаться в main () на C ++?
  • Давайте будем гением компьютера.