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

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

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

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

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

Каковы ваши мысли по этому вопросу?

Ответ 1

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

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

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

Ответ 2

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

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

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

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

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

Ответ 3

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

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

Ответ 4

Использование system("pause"); - это практика Ungood Practice & trade; потому что

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

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

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

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

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

Ответ 5

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

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

Ответ 6

Вы можете использовать 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. Он зависит от платформы и фактически вызывает "виртуальную" ОС.

Ответ 7

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

pause

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

Ответ 8

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

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

Ответ 9

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

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

Ответ 10

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

Ответ 11

Возникали проблемы с попыткой запустить систему ("Пауза") при кодировании в C++ на моем Raspberry Pi с использованием Codeblocks, но это работало бы хорошо при использовании Codeblocks на моем ноутбуке с Windows 10. Теперь я знаю, почему я могу перестать тянуть свои волосы! Ой! getchar() полностью с этого момента. Спасибо! :)

Ответ 12

system("pause");  

неправильно, потому что это часть Windows API и поэтому не будет работать в других операционных системах.

Вы должны попытаться использовать только объекты из стандартной библиотеки C++. Лучшим решением будет написать:

cin.get();
return 0;

Но это также может вызвать проблемы, если у вас есть другие cin в вашем коде. Потому что после каждого cin вы нажимаете Enter или \n который является символом пробела. cin игнорирует этот символ и оставляет его в буферной зоне, но cin.get() получает этот оставшийся символ. Таким образом, элемент управления программы достигает строки, return 0 и консоль закрывается, прежде чем вы увидите результаты.
Чтобы решить эту проблему, мы пишем код следующим образом:

cin.ignore();  
cin.get();  
return 0;

Ответ 13

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

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

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

Ответ 14

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