2009-07-10 3 views
97

Вот вопрос, который я не совсем понимаю:система («пауза»); - Почему это неправильно?

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

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

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

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

+0

related: http://stackoverflow.com/questions/900666/system-calls-in-c-and-their-roles-in-programming –

+4

По-видимому, людям нравится их призывы к паузе, чтобы быть действительно эффективными. Другими словами, «Поторопись и остановись!» –

+43

Вас учили, потому что в целом учителя плохо программисты – wich

ответ

62

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

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

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

+3

Visual Studio может запускать программу в двух режимах: с или без отладки. При запуске в режиме отладки он останавливается при первой точке прерывания. Если у вас нет одного, он запустит программу и закроет консоль. Итак, если вы хотите остановить консольную программу, просто установите точку прерывания или, еще лучше, запустите ее без отладки! Это выполнит программу и остановит консоль. –

+0

Это не только функция Visual Studio - если вы запускаете консольную программу из Windows (т. Е. В отличие от загрузки командной строки и запуска ее оттуда), она также закрывается, когда она завершается. – JBentley

+2

** - 1 ** Re "консольное окно, запущенное из Visual Studio, закрывается, когда программа завершила выполнение", нет, только когда программа запускается в отладчике. Re "запускает программу« пауза »в командной строке Windows, нет такой функции (' pause' является внутренней командой в 'cmd.exe'). Список лучших идей также сильно отсутствует. –

18

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

Дополнительное разъяснение в this артикул.

+0

Вау, ты снова! Вы живете здесь? lol В любом случае, спасибо, я прочитаю. В то же время, что вы думаете по этому поводу? – Faken

+0

У меня был такой же вопрос, когда я впервые начал C несколько лет назад, и я указал на эту же статью. Я использую getchar() лично. –

+0

Ho wow ... Я не делал C++ некоторое время, но да .. есть окончательно лучшие способы достижения тех же результатов. – Newtopian

8

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

pause 

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

32

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

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

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

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

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

+50

Для кого-то, жалующегося на зависимость от платформы, кажется странным предлагать '_getch', особенно, когда стандартный C++ предоставляет' getchar'. – paxdiablo

+25

Я чувствую какую-то иронию при вычислении накладных расходов для взаимодействия с человеком) – ShPavel

+0

Возможно, вы еще не слышали о видеоиграх. – orfdorf

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

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

4

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

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

-3

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

+3

* Это действительно не имеет значения в памяти, потому что я уверен, что те парни, которые изобрели систему («пауза»), ожидали, что она будет использоваться часто * действительно не имеет никакого смысла. Noone «придумал» это, «пауза» была разработана для использования в пакетных программах DOS, никогда не использовалась так, как это делается. Кроме того, были лучшие альтернативы, прежде чем кто-либо был настолько сумасшедшим, чтобы набрать фразу 'system (« pause »);'. – wich

2

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

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

+6

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

+0

@JBentley: Я говорил о ситуации _after_, показывая результаты, если они есть. Для отображения результатов существуют соответствующие шаблоны, такие как сигналы, прерывания, таймеры, прокрутка в вашем терминале, файлы. 'system (" pause ")' сама по себе ничего не отображает. Программа интерфейса командной строки, которая вызывается не из командной строки и закрывается слишком рано, вызывается неправильно и с неправильными параметрами, а использование 'system (" pause ")', чтобы обойти неправильно запущенную программу, действительно не так. , –

+1

Я имею в виду, просто представьте себе 'cat',' less', 'vi',' OpenOffice', 'Mathematica',' GNU Octave', что, если они будут использовать 'system (" pause ")'? Это будет раздражать. –

12

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

+3

Меня учили использовать 'System (« pause »)' в первом курсе программирования, но я хотел иметь возможность запускать свои программы на своем Mac, поэтому мне нужно было узнать о 'cin.get()'. – daviewales

0

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

-2

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

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

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

12

Использование system("pause"); является Ungood практика ™ потому

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

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

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

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

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

+0

Иногда для быстрых тестов требуется Ungood Practice ™ .... то, что мы называем «быстрым и грязным», –

Смежные вопросы