System pause c что это такое
вот вопрос, который я не совсем понял:
команды system(«pause»); преподается новым программистам как способ приостановить программу и дождаться продолжения ввода с клавиатуры. Однако, похоже, многие опытные программисты неодобрительно относятся к этому как к чему-то, что не следует делать в той или иной степени.
Я, сам новый программист без формального обучения программированию. Я использую его, потому что меня научили им пользоваться. Чего я не понимаю, так это того, что если это не то, что можно использовать, тогда почему меня учили использовать это? Или, с другой стороны, все не так уж плохо?
что вы думаете по этому поводу?
12 ответов
Он нахмурился, потому что это специфичный для платформы хак, который не имеет ничего общего с фактическим обучением программированию, но вместо этого, чтобы обойти функцию IDE/OS-окно консоли, запущенное из Visual Studio, закрывается, когда программа закончила выполнение, и поэтому новый пользователь не может видеть выход своей новой программы.
Bodging in System («pause») запускает программу командной строки Windows «pause» и ждет ее завершения, прежде чем продолжить выполнение программа-окно консоли остается открытым, поэтому вы можете прочитать вывод.
лучшей идеей было бы поставить точку останова в конце и отладить ее, но у этого снова есть проблемы.
это медленно. Это зависит от платформы. Это небезопасно.
Что делать, если программа под названием «пауза» была помещена в путь пользователя? Просто вызов системы («пауза») гарантирует только выполнение программы под названием «пауза «(надеюсь, что у вас нет ваш исполняемый файл с именем «пауза»!)
в основном: зачем вводить так много потенциальных проблем, когда вы можете просто добавить две строки кода и один включить и получить много более гибкий механизм?
простой getchar () должен делать все в порядке.
В общем, он должен приостановить выполнение программ и сделать системный вызов и выделить ненужные ресурсы, когда вы можете использовать что-то простое, как cin.получить.)( Люди используют System («пауза»), потому что они хотят, чтобы программа ждала, пока они не нажмут enter, чтобы они могли видеть свой вывод. Если вы хотите, чтобы программа ждала ввода, есть встроенные функции для того, что также кросс-платформенные и менее требовательные.
дальнейшее объяснение в этой статья.
используя system(«pause»); Это плохая практика™, потому что
это проблематично и раздражает
при запуске программы из командной строки. Для интерактивного выполнения вы должны нажать клавишу в конце без какой-либо цели. И для использования в автоматизации какой-то задачи, что pause очень нежелательно!
на внутренний cmd.exe команда и не может быть переопределенным, как ошибочно утверждается по крайней мере в одном другом ответе. Т. е. это не риск для безопасности, и утверждение, что AV-программы диагностируют его как таковое, столь же сомнительно, как и утверждение о переопределении команды (в конце концов, программа c++ вызывает system в состоянии сделать все, что может сделать интерпретатор команд, и многое другое). Кроме того, хотя этот способ приостановки чрезвычайно неэффективен по обычным стандартам программирования на C++, это не имеет никакого значения в конце новичка программа.
можно использовать std::cin.get() С iostream :
потому что это не портативный.
как указано в других ответах, есть много причин, которые вы можете найти, чтобы избежать этого. Все сводится к одной причине, которая делает остальное спорным. The System() функция по своей сути небезопасна / ненадежна и не должна вводиться в программу без необходимости.
для задания студента это условие никогда не выполнялось, и по этой причине я бы провалил задание, даже не запустив программу, если бы присутствовал вызов этого метода. (Это было ясно из начать.)
для меня вообще не имеет смысла ждать, прежде чем выходить без причины. Программа, которая сделала свою работу, должна просто закончить и передать свои ресурсы обратно своему создателю.
также не стоит молча ждать в темном углу после рабочего дня, ожидая, когда кто-то наклонит плечо.
вот одна из причин, по которой вы не должны использовать его: это будет раздражать большинство антивирусных программ, работающих на Windows, Если вы передаете программу на другую машину, потому что это угроза безопасности. Даже если ваша программа состоит только из простого cout Это тяжелый ресурс, и программа получает доступ к команде cmd, которую антивирусы рассматривают как угрозу.
профессионал в использовании системы («пауза»); при создании небольших частей вашей программы для отладки ее самостоятельно. если вы используете его для получения результатов переменных до и после каждого процесса, чтобы убедиться, что они работают правильно.
после тестирования и перемещения его в полный ход с остальной частью решения вы должны удалить эти строки. это действительно хорошо при тестировании пользовательского алгоритма и обеспечении того, что вы делаете все правильно заказ для результатов, которые вы хотите.
ни в коем случае вы не хотите использовать это в приложении после того, как вы протестировали его и заверили, что он работает правильно. Однако это позволяет отслеживать все, что происходит, как это происходит. Не используйте его для приложений конечного пользователя вообще.
все дело в стиле. Это полезно для отладки, но в противном случае он не должен использоваться в окончательной версии программы. Это действительно не имеет значения в вопросе памяти, потому что я уверен, что те ребята, которые изобрели систему(«пауза»), ожидали, что она будет использоваться часто. С другой стороны, компьютеры регулируют свою память для всего остального, что мы используем на компьютере, и это не представляет прямой угрозы, такой как динамическое распределение памяти, поэтому я бы рекомендовал его для отладка кода, но ничего больше.
Блог Петра Калинина
У языка программирования C++, а также у популярных IDE для этого языка, есть ряд особенностей, которые надо бы знать, чтобы эффективно писать на нем программы. В этом посте я постараюсь описать основные такие особенности, в первую очередь относящиеся к написанию небольших программ типа олимпиадных; возможно, в дальнейшем буду постепенно добавлять сюда что-нибудь. Сначала опишу особенности IDE, потому что они полезны даже тем, кто только начинает писать на C++, а потом особенности самого языка, которые нужны уже чуть более продвинутым школьникам.
Особенности IDE
На олимпиадах наиболее популярны две IDE по C++: это Code::blocks (полностью свободно распространяемая и кроссплатформеная) и Microsoft Visual Studo (есть бесплатный вариант, только под Windows, не путайте с Visual Studio Code!). Еще последнее время набирает популярность CLion, но у него нет полностью бесплатной версии, и я его (применительно к олимпиадам) не очень хорошо знаю, поэтому упоминать его не буду.
Code::blocks
Это достаточно простая IDE без особых заморочек, очень напоминает простые IDE из других языков программирования, типа Wing IDE для питона и встроенной IDE для Pascal ABC. Все просто: создаете новый файл, пишете код, запускаете кнопкой с зеленой стрелочкой (точнее, кнопкой с шестеренкой и зеленой стрелочкой, потому что вам обычно надо скомпилировать, и только потом запускать код). После запуска и завершения программы code::blocks задерживает окошко программы на экране, чтобы вы смогли посмотреть, что вывела ваша программа, поэтому вам не надо писать в конце программы какой-либо код для приостановки программы (типа system(«pause») или getch ).
Во-вторых, не так просто сделать, чтобы заработал дебаггер. Для этого, во-первых, надо, чтобы дебаггер был установлен на компьютере (code::blocks использует компилятор gcc и дебаггер gdb, надо, чтобы они были установлены), во-вторых, просто файлы, созданные по кнопке “new”, code::blocks не будет отлаживать. Чтобы дебаггер заработал, надо в code::blocks создать “проект”, и уже в “проект” добавить файл с исходным кодом (существующий или новый). Но это достаточно просто и прямолинейно.
Заметно более продвинутая, профессиональная, IDE. В ней вы не можете просто так создать новый файл, в ней надо создавать “проект”. И тут есть две проблемы.
Обе проблемы решаются правильным созданием проекта. А именно, при создании проекта надо явно убедиться, что вы указали два параметра для проекта: во-первых, это должно быть console application (это повлияет на задержку программы, см. ниже), во-вторых, это должно быть empty project (а это повлияет на pch).
Как это сделать, зависит от версии Visual Studio. В старых версиях в окошке создания проекта надо было выбрать тип проекта а-ля Console application, и уже далее в следующем окошке поставить галочку Empty project. В последних версиях надо выбрать тип проекта “Windows Desktop Wizard”, по-русски “Мастер классических приложений Windows” (не “пустой проект”, не “консольное приложение”, а именно “wizard”/”мастер”, его всегда непросто найти), и в следующем окошке в выпадающем меню выбрать Console application и поставить галочку Empty project.
Общие особенности
(Этот раздел в основном скопирован из моего текста про областную олимпиаду.)
Быстрый ввод-вывод
Стандартный ввод/вывод через iostream (т.е. с использованием cin / cout ) по умолчанию работает медленно на больших данных. Если вам надо ввести, допустим, 100000 чисел, то с использованием cin вы наверняка получите time limit; аналогично если вам надо выводить много данных. Это связано с двумя проблемами.
Во-вторых, есть еще проблема синхронизации с stdio (не буду сейчас подробнее писать, что это значит). Чтобы эту проблему побороть, есть три способа:
Лично я вам рекомендую использовать первый или последний вариант.
Установка стека
В популярных компиляторах C++ по умолчанию установлен очень маленький размер стека. Если в вашей программе глубокая рекурсия (например, если вы пишете поиск в глубину), то программа может упасть.
Число 64000000 в обоих примерах выше — это необходимый вам размер стека в байтах (в примерах 64 миллиона байт, т.е. примерно 64 Мб). Размер стека можете посчитать в уме исходя из вашей программы (умножьте глубину рекурсии на размер памяти, требуемый на один уровень рекурсии — это примерно сколько памяти занимают все переменные на одном уровне, плюс 10-20 байт), а можете и подобрать опытным путем — 32-64 Мб обычно достаточно. Учитывайте еще, конечно, ограничение по памяти.
Поэтому если вы пишете на MSVS, то всегда явно устанавливайте размер стека. Если пишете на g++ в code::blocks, настройте в настройках code::blocks для локального запуска, и надейтесь, что в тестирующей системе жюри это нормально настроит (по-нормальному это должно быть видно в памятке участника). Если пишете на g++ и компилируете из командной строки вручную, то добавляйте нужный параметр и, опять-таки, надейтесь на жюри. Если вдруг жюри не настроило стек на g++, но при этом предоставляет возможность отправки под MSVS, то добавьте магическую MSVS-строчку и отправляйте под MSVS, даже если вы пишете под g++.
Стандарты языка
У языка c++ есть разные версии, называемые стандартами. Из распространенных сейчас это C++03, C++11 (давным-давно был известен как C++0x), C++14 и C++17. Они отличаются небольшими, но зачастую удобными вещами (например, auto и range-based loops типа for (auto x : v) появились только в C++11).
Вот вопрос, который я не совсем понимаю:
Команда system(«pause»); преподается новым программистам как способ приостановить программу и дождаться продолжения ввода с клавиатуры. Однако многие опытные программисты, похоже, не одобряют это, как то, что не следует делать в той или иной степени.
Некоторые говорят, что это нормально. Некоторые говорят, что его можно использовать только тогда, когда вы заперты в своей комнате и никто не смотрит. Некоторые говорят, что они лично придут к вам домой и убьют вас, если вы им воспользуетесь.
Я сам новый программист без формального обучения программированию. Я использую его, потому что меня научили этим пользоваться. Я не понимаю, что если это не то, что нужно использовать, то почему меня учили этим пользоваться? Или, с другой стороны, все-таки не так уж и плохо?
Что вы думаете по этому поводу?
13 ответов
Лучшей идеей было бы поставить точку останова в конце и отладить ее, но здесь снова есть проблемы.
Простой getchar () подойдет.
Это проблемно и раздражает
при запуске программы из командной строки. Для интерактивного выполнения вы должны нажимать клавишу в конце без какой-либо цели. И для использования в автоматизации некоторых задач, которые pause очень нежелательны!
Таким образом, он должен приостанавливать выполнение программ и выполнять системный вызов и выделять ненужные ресурсы, когда вы могли бы использовать что-то столь же простое, как cin.get (). Люди используют Систему («ПАУЗА»), потому что они хотят, чтобы программа ждала, пока они не нажмут Enter, чтобы они могли увидеть свой вывод. Если вы хотите, чтобы программа ожидала ввода, для этого есть встроенные функции, которые также являются кроссплатформенными и менее требовательными.
Дальнейшее объяснение см. В этой статье.
Вы можете использовать std::cin.get() из iostream :
Потому что он не переносится.
Как указано в других ответах, есть много причин, по которым вы можете избежать этого. Все сводится к одной причине, которая делает остальное спорным. Функция System() по своей природе небезопасна / ненадежна, и ее не следует вводить в программу без необходимости.
Для студенческого задания это условие никогда не выполнялось, и по этой причине я бы провалил задание, даже не запустив программу, если бы присутствовал вызов этого метода. (Это было ясно с самого начала.)
Для меня вообще нет смысла ждать перед выходом без причины. Программа, которая выполнила свою работу, должна просто завершить работу и передать свои ресурсы ее создателю.
Также не стоит молча ждать в темном углу после рабочего дня, ожидая, что кто-то опрокинет плечо.
Неверно, потому что это часть Windows API и поэтому не будет работать в других операционных системах.
Вам следует попробовать использовать только объекты из стандартной библиотеки C ++. Лучшим решением будет написать:
Вот одна из причин, по которой вы не должны его использовать: это вызовет раздражение у большинства антивирусных программ, работающих в Windows, если вы передадите программу другому компьютеру, потому что это угроза безопасности. Даже если ваша программа состоит только из простого cout Это ресурсоемкий процесс, и программа получает доступ к команде cmd, которую антивирусы считают угрозой.
Все дело в стиле. Это полезно для отладки, но в остальном его не следует использовать в окончательной версии программы. На самом деле это не имеет значения по поводу памяти, потому что я уверен, что те ребята, которые изобрели систему («пауза»), ожидали, что она будет часто использоваться. С другой стороны, компьютеры в любом случае ограничивают свою память для всего остального, что мы используем на компьютере, и это не представляет прямой угрозы, такой как динамическое выделение памяти, поэтому я бы рекомендовал его для отладки кода, но не более того.
Это медленно. Это зависит от платформы. Это небезопасно.
Во-первых: что он делает. Вызов «system» буквально похож на ввод команды в командной строке Windows. Чтобы ваше приложение совершило такой вызов, требуется множество настроек и разборок, а накладные расходы просто смехотворны.
Что, если программа под названием «пауза» была помещена в пользовательский PATH? Просто вызов системы («пауза») гарантирует только выполнение программы с именем «пауза» (надеюсь, что у вас нет исполняемого файла с именем «пауза»!)
По сути: зачем вводить столько потенциальных проблем, если можно просто добавить две строки кода и одну включить и получить гораздо более гибкий механизм?
Плюсы к использованию системы («ПАУЗА»); в то время как создание небольших частей вашей программы предназначено для ее самостоятельной отладки. если вы используете его для получения результатов переменных до и после каждого используемого вами процесса, чтобы убедиться, что они работают правильно.
После тестирования и приведения его в действие с остальной частью раствора вы должны удалить эти линии. это действительно хорошо при тестировании определенного пользователем алгоритма и обеспечении уверенности в том, что вы делаете все в правильном порядке для получения желаемых результатов.
Ни в коем случае вы не хотите использовать это в приложении после того, как протестировали его и убедились, что оно работает правильно. Однако это позволяет вам отслеживать все, что происходит, по мере того, как это происходит. Ни в коем случае не используйте его для приложений конечных пользователей.
Here’s a question that I don’t quite understand:
The command, system(«pause»); is taught to new programmers as a way to pause a program and wait for a keyboard input to continue. However, it seems to be frowned on by many veteran programmers as something that should not be done in varying degrees.
Some people say it is fine to use. Some say it is only to be used when you are locked in your room and no one is watching. Some say that they will personally come to your house and kill you if you use it.
I, myself am a new programmer with no formal programming training. I use it because I was taught to use it. What I don’t understand is that if it is not something to be used, then why was I taught to use it? Or, on the flip side, is it really not that bad after all?
What are your thoughts on this subject?
13 Answers 13
A better idea would be to put a breakpoint at the end and debug it, but that again has problems.
It’s slow. It’s platform dependent. It’s insecure.
What if a program called «pause» was placed into the user’s PATH? Just calling system(«pause») only guarantees that a program called «pause» is executed (hope that you don’t have your executable named «pause»!)
Basically: why introduce so many potential problems when you can simply add two lines of code and one include and get a much more flexible mechanism?
a simple getchar() should do just fine.
Using system(«pause»); is Ungood Practice™ because
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.
The pause command is an internal cmd.exe command and can’t be overridden, as is erroneously claimed in at least one other answer. I.e. it’s not a security risk, and the claim that AV programs diagnose it as such is as dubious as the claim of overriding the command (after all, a C++ program invoking system is in position to do itself all that the command interpreter can do, and more). Also, while this way of pausing is extremely inefficient by the usual standards of C++ programming, that doesn’t matter at all at the end of a novice’s program.
Вот вопрос, который я не совсем понимаю:
Эта команда system(«pause»); преподается новым программистам как способ приостановить программу и дождаться продолжения ввода с клавиатуры. Однако многие опытные программисты, похоже, не одобряют это, как то, что не следует делать в той или иной степени.
Некоторые люди говорят, что это нормально. Некоторые говорят, что его можно использовать только тогда, когда вы заперты в своей комнате и никто не смотрит. Некоторые говорят, что они лично придут к вам домой и убьют вас, если вы им воспользуетесь.
Я сам новый программист без формального обучения программированию. Я использую его, потому что меня научили им пользоваться. Чего я не понимаю, так это того, что если это не то, что нужно использовать, то почему меня учили этим пользоваться? Или, с другой стороны, все-таки не так уж и плохо?
Что вы думаете по этому поводу?
Лучшей идеей было бы поставить точку останова в конце и отладить ее, но здесь снова есть проблемы.
Это медленно. Это зависит от платформы. Это небезопасно.
Во-первых: что он делает. Вызов «система» буквально похож на ввод команды в командной строке Windows. Чтобы ваше приложение совершило такой вызов, требуется множество настроек и демонтажа, а накладные расходы просто смехотворны.
Что, если программа под названием «пауза» была помещена в пользовательский PATH? Просто вызов системы («пауза») гарантирует только выполнение программы с именем «пауза» (надеюсь, что у вас нет исполняемого файла с именем «пауза»!)
По сути: зачем вводить столько потенциальных проблем, если можно просто добавить две строки кода и одну включить и получить гораздо более гибкий механизм?
простой getchar () подойдет.
Это проблематично и раздражает,
когда вы запускаете программу из командной строки. Для интерактивного выполнения вы должны нажимать клавишу в конце без какой-либо цели. И для использования в автоматизации некоторых задач, которые pause очень нежелательны!
Это не переносно.
Unix-land не имеет стандартной pause команды.
Это pause внутренняя cmd.exe команда, и ее нельзя переопределить, поскольку это ошибочно заявлено как минимум в одном другом ответе. Т.е. это не угроза безопасности, и утверждение о том, что антивирусные программы диагностируют его как таковое, столь же сомнительно, как и утверждение о переопределении команды (в конце концов, вызываемая программа на C ++ system может делать все, что может делать интерпретатор команд, и Больше). Кроме того, хотя этот способ приостановки крайне неэффективен по обычным стандартам программирования на C ++, это не имеет никакого значения в конце программы для новичка.