2015-06-17 4 views
0

Недавно я установил Visual Studio 2013, поэтому я относительно новичок. Я пытаюсь запустить код ниже:Visual Studio 2013 закрывает

#include <iostream> 

int main() 
{ 
    std::cout << "Hello World! "; 
} 

но терминал, который предполагается открыть для отображения «Hello World» закрывается немедленно и оленья кожа дать мне шанс, чтобы увидеть, был ли он напечатан.

Программа выводит:

The program '[480] Project2.exe' has exited with code 0 (0x0). 

Кроме того, я прочитал некоторые предыдущие сообщения, которые предлагают добавить систему («пауза») до конца основной(), однако почему это, что мне нужно сделать это в первую очередь? Что-то не так с моей Visual Studio?

Заранее благодарен!

ответ

1

Все в порядке с Visual Studio.
Это ожидаемое поведение вашей программы.

Во-первых, вам нужно понять, что Visual Studio никоим образом не влияет на процесс выполнения программы после ее компиляции и запуска. Он не должен «приостанавливать программу» в самом конце выполнения. Итак, если вы запустите свое приложение, нажав F5 в Visual Studio или запустите его за пределами Visual Studio как exe -файл, вы получите тот же результат.

Теперь вопрос другой: «Почему приложения консоли закрываются сразу после выполнения, а не приостанавливаются в конце и позволяют мне что-то читать»? Ответ заключается в том, что предполагается, что консольные приложения должны выполняться. Он запускается, выполняет некоторый код и возвращает 0 (в хорошем случае). Если они запущены в консоли, результаты выполнения будут отображаться на консоли. Однако, если они запускаются за пределами консоли, в качестве приложения они открывают консоль, выводят что-то и закрывают, прежде чем что-либо читать.

Например, возьмите приложение runas. Попробуйте открывающейся консоль (Win+R ->cmd) и введите

runas 

Вы увидите помощь, объясняющую, как использовать runas приложения. Сразу после вывода этого значения он закроется, и элемент управления будет возвращен на cmd.exe. Вы сможете запускать другие приложения.

Теперь попробуйте открыть его вне консоли, используя cmd снова (не пугайтесь, это абсолютно безопасно):

%windir%\system32\runas.exe 

Та же информация будет outputed к консоли, но вы, вероятно, выиграл» У меня есть время, чтобы прочитать что-нибудь.

Подводя итог: ваша Консоль приложение должно что-то сделать, вывести некоторую информацию и закрыть после нее. Вот как они работают. Однако в процессе разработки вам нужно будет поставить «паузу», точку останова или что-то еще в конце приложения, чтобы увидеть результаты выполнения.
Что касается меня, то самый удобный подход - это вставка этой строки в конце приложения.

Console.ReadKey(); 
return 0; 

Вы также можете использовать Ctrl+F5 для запуска приложения в консоли без отладки.
Он выполнит команду консоли pause, которая выводит «Нажмите любую клавишу, чтобы продолжить ...» перед закрытием. Однако вы не сможете его отладить.

+0

Спасибо! Я очень этому знаю, это было очень полезно! –

0

Попробуйте добавить эти две строки:

system("pause>nul"); 
return 0; 
+0

Я думаю, мой вопрос, почему мне нужно добавить эти две строки? Должна ли Visual Studio не делать этого? –

+0

Собственно, только первый должен это сделать. Вам нужно добавить их, чтобы они могли видеть результат. В противном случае программа запускается, печатает «Hello World», а затем закрывается, потому что у нее нет другого оператора для выполнения. –

1

Debug> Start Without Debugging

Ctrl + F5

+1

Наконец, простой и эффективный ответ :) –

+1

@DmitryLedentsov Кто-то только что установил Visual Studio в ** в первый раз ** и, скорее всего, он не знает, как все работает. Он пришел сюда, чтобы понять, почему это происходит. Говорить ему что-то без объяснений - это не лучший подход в этом случае. В следующий раз он снова придет сюда, спросив: «Я нажал Ctrl + F5, но точка останова не работает». Люди в SO не конкурируют в краткости ответа. Простота не всегда хороша. –

+0

@YeldarKurmangaliyev действительные баллы, Yeldar. Ваш ответ великолепно разработан. Я бы добавил только стандартный способ библиотеки C++ для выражения 'Console.ReadKey();', поскольку он выглядит как вызов API .net, а не стандартный C++ –