система("пауза"); - почему это неправильно?
вот вопрос, который я не совсем понял:
команды system("pause");
преподается новым программистам как способ приостановить программу и дождаться продолжения ввода с клавиатуры. Однако, похоже, многие опытные программисты неодобрительно относятся к этому как к чему-то, что не следует делать в той или иной степени.
некоторые люди говорят, что это нормально использовать. Некоторые говорят, что он должен использоваться только тогда, когда вы заперты в своей комнате, и никто не смотрит. Некоторые говорят, что они будут лично приходи к себе домой и убей себя, если воспользуешься им.
Я, сам новый программист без формального обучения программированию. Я использую его, потому что меня научили им пользоваться. Чего я не понимаю, так это того, что если это не то, что можно использовать, тогда почему меня учили использовать это? Или, с другой стороны, все не так уж плохо?
что вы думаете по этому поводу?
12 ответов
Он нахмурился, потому что это специфичный для платформы хак, который не имеет ничего общего с фактическим обучением программированию, но вместо этого, чтобы обойти функцию IDE/OS-окно консоли, запущенное из Visual Studio, закрывается, когда программа закончила выполнение, и поэтому новый пользователь не может видеть выход своей новой программы.
Bodging in System ("pause") запускает программу командной строки Windows "pause" и ждет ее завершения, прежде чем продолжить выполнение программа-окно консоли остается открытым, поэтому вы можете прочитать вывод.
лучшей идеей было бы поставить точку останова в конце и отладить ее, но у этого снова есть проблемы.
это медленно. Это зависит от платформы. Это небезопасно.
во-первых: что он делает. Вызов "системы" буквально похож на ввод команды в командной строке windows. Существует тонна настройки и демонтажа для вашего приложения, чтобы сделать такой вызов - и накладные расходы просто смешны.
Что делать, если программа под названием "пауза" была помещена в путь пользователя? Просто вызов системы ("пауза") гарантирует только выполнение программы под названием "пауза "(надеюсь, что у вас нет ваш исполняемый файл с именем "пауза"!)
просто напишите свою собственную функцию " Pause ()", которая использует _getch. Хорошо, конечно, _getch также зависит от платформы (Примечание: это определено в " conio.ч") - но это гораздо приятнее, чем system()
Если вы разрабатываете на Windows, и это имеет тот же эффект (хотя это ваша ответственность, чтобы предоставить текст с cout или около того).
в основном: зачем вводить так много потенциальных проблем, когда вы можете просто добавить две строки кода и один включить и получить много более гибкий механизм?
- slow: он должен прыгать через множество ненужный код Windows и отдельная программа для простого операция
- Не портативный: зависит от программа паузы
- Не хороший стиль: выполнение системного вызова должно быть только сделано, когда действительно необходимые
- более ввод: система ("пауза") длиннее чем getchar()
простой getchar () должен делать все в порядке.
В общем, он должен приостановить выполнение программ и сделать системный вызов и выделить ненужные ресурсы, когда вы можете использовать что-то простое, как cin.получить.)( Люди используют System ("пауза"), потому что они хотят, чтобы программа ждала, пока они не нажмут enter, чтобы они могли видеть свой вывод. Если вы хотите, чтобы программа ждала ввода, есть встроенные функции для того, что также кросс-платформенные и менее требовательные.
дальнейшее объяснение в этой статья.
используя system("pause");
Это плохая практика™, потому что
полностью лишних.
Чтобы сохранить окно консоли программы открытым в конце при запуске из Visual Studio, используйте Ctrl+Ф5 чтобы запустить его без отладки или поместить точку останова в последнюю правую скобку}
ofmain
. Итак, никаких проблем в Visual Studio. И, конечно, никаких проблем, когда вы запускаете его из команды линия.это проблематично и раздражает
при запуске программы из командной строки. Для интерактивного выполнения вы должны нажать клавишу в конце без какой-либо цели. И для использования в автоматизации какой-то задачи, чтоpause
очень нежелательно!это не портативный.
Unix-land не имеет стандарта .
на внутренний cmd.exe
команда и не может быть переопределенным, как ошибочно утверждается по крайней мере в одном другом ответе. Т. е. это не риск для безопасности, и утверждение, что AV-программы диагностируют его как таковое, столь же сомнительно, как и утверждение о переопределении команды (в конце концов, программа c++ вызывает system
в состоянии сделать все, что может сделать интерпретатор команд, и многое другое). Кроме того, хотя этот способ приостановки чрезвычайно неэффективен по обычным стандартам программирования на C++, это не имеет никакого значения в конце новичка программа.
Итак, претензии в Орде ответов до этого не верны, и основная причина, по которой вы не должны использовать system("pause")
или любая другая команда ожидания в конце main
, это первый пункт выше: это совершенно ненужно, это не служит абсолютно никакой цели, это просто очень глупо.
можно использовать 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
. Он зависит от платформы и фактически вызывает "виртуальную" ОС.
потому что это не портативный.
pause
- это программа только для windows / dos, поэтому ваш код не будет работать в linux. Более того,system
обычно не считается очень хорошим способом вызова другой программы - обычно лучше использовать CreateProcess
или fork
или что-то подобное.
как указано в других ответах, есть много причин, которые вы можете найти, чтобы избежать этого. Все сводится к одной причине, которая делает остальное спорным. The System()
функция по своей сути небезопасна / ненадежна и не должна вводиться в программу без необходимости.
для задания студента это условие никогда не выполнялось, и по этой причине я бы провалил задание, даже не запустив программу, если бы присутствовал вызов этого метода. (Это было ясно из начать.)
для меня вообще не имеет смысла ждать, прежде чем выходить без причины. Программа, которая сделала свою работу, должна просто закончить и передать свои ресурсы обратно своему создателю.
также не стоит молча ждать в темном углу после рабочего дня, ожидая, когда кто-то наклонит плечо.
вот одна из причин, по которой вы не должны использовать его: это будет раздражать большинство антивирусных программ, работающих на Windows, Если вы передаете программу на другую машину, потому что это угроза безопасности. Даже если ваша программа состоит только из простого cout << "hello world\n"; system("pause");
Это тяжелый ресурс, и программа получает доступ к команде cmd, которую антивирусы рассматривают как угрозу.
профессионал в использовании системы ("пауза"); при создании небольших частей вашей программы для отладки ее самостоятельно. если вы используете его для получения результатов переменных до и после каждого процесса, чтобы убедиться, что они работают правильно.
после тестирования и перемещения его в полный ход с остальной частью решения вы должны удалить эти строки. это действительно хорошо при тестировании пользовательского алгоритма и обеспечении того, что вы делаете все правильно заказ для результатов, которые вы хотите.
ни в коем случае вы не хотите использовать это в приложении после того, как вы протестировали его и заверили, что он работает правильно. Однако это позволяет отслеживать все, что происходит, как это происходит. Не используйте его для приложений конечного пользователя вообще.
все дело в стиле. Это полезно для отладки, но в противном случае он не должен использоваться в окончательной версии программы. Это действительно не имеет значения в вопросе памяти, потому что я уверен, что те ребята, которые изобрели систему("пауза"), ожидали, что она будет использоваться часто. С другой стороны, компьютеры регулируют свою память для всего остального, что мы используем на компьютере, и это не представляет прямой угрозы, такой как динамическое распределение памяти, поэтому я бы рекомендовал его для отладка кода, но ничего больше.