Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.87
Japanese
9 / 9 / 1
Регистрация: 14.11.2010
Сообщений: 128
#1

Небольшая странность в "Hello World!" - C++

19.11.2010, 06:53. Просмотров 1987. Ответов 10
Метки нет (Все метки)

Начал изучать C++ по учебнику "Джесс Либерти - Освой самостоятельно С++ за 21 день"
И сразу же столкнулся с проблемой:
в книге имеется исходник программы "Hello World!", автор говорит что после компиляции и запуска программа должна вывести на экран в дос окне слова "Hello World!"
этого не произошло. Окно появилось и сразу закрылось.
Вот исходник из книги:
C++
1
2
3
4
5
6
7
8
9
10
#include "stdafx.h"
#include <iostream>
using namespace std;
 
 
int main()
{
    cout<<"Hello World!\n";
    return 0;
}
Тогда я заместо
C++
1
return 0;
вставил
C++
1
_getch();
C++
1
2
3
4
5
6
7
8
9
10
11
#include "stdafx.h"
#include <iostream>
#include <conio.h>
using namespace std;
 
 
int main()
{
    cout<<"Hello World!\n";
    _getch();
}
Программа не закрылась из-за того что
C++
1
_getch()
ждал нажатия любой клавиши.

Так вот мне непонятно одно: если автор написал в своем исходнике
C++
1
return 0;
это значит что у него программа сразу не закрылась? Если так, то почему же у меня закрывается при использовании
C++
1
return 0;
?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.11.2010, 06:53
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Небольшая странность в "Hello World!" (C++):

Обучение по книге Страуструпа "принципы и практика C++". Не выводится "Hello, World" - C++
Ребят, помогите пожалуйста, пропал на первом же примере из книги, автор даёт код для вывода Hello world!#include &quot;std_lib_facilities.h&quot; ...

В зависимости от времени года "весна", "лето", "осень", "зима" определить погоду "тепло", "жарко", "холодно", "очень холодно" - C++
В зависимости от времени года &quot;весна&quot;, &quot;лето&quot;, &quot;осень&quot;, &quot;зима&quot; определить погоду &quot;тепло&quot;, &quot;жарко&quot;, &quot;холодно&quot;, &quot;очень холодно&quot;. Я так...

Реализовать классы "Воин", "Пехотинец", "Винтовка", "Матрос", "Кортик" (наследование) - C++
Разработать программу с использованием наследования классов, реализующую классы: − воин; − пехотинец(винтовка); − матрос(кортик). ...

"Первый после Hello, world!". Программа решения квадратного уравнения - C++
Добрый день, уважаемые форумчане. Покритикуйте пожалуйста, программу вывода на экран в полиномиальной форме и нахождения корней квадратного...

Не работает "Hello world" в CodeGear™ RAD Studio 2009 - C++
Сегодня начал изучать С++. На одном сайте нашёл код для &quot;Hello world!&quot; #include &lt;iostream&gt; using namespace std; int main() { ...

Hello World и ошибка "This function or variable may be unsafe. Consider using strcpy_s instead" - C++
int str() { char str21; char str1 = &quot;Hello World&quot;; strcpy(str21, str1); cout &lt;&lt; str1 &lt;&lt; &quot;\n&quot; &lt;&lt; strlen(str1) &lt;&lt; &quot;\n&quot; &lt;&lt;...

10
Nameless One
Эксперт С++
5775 / 3425 / 255
Регистрация: 08.02.2010
Сообщений: 7,448
19.11.2010, 07:22 #2
Цитата Сообщение от Japanese Посмотреть сообщение
Так вот мне непонятно одно: если автор написал в своем исходнике
C++
1
return 0;
это значит что у него программа сразу не закрылась?
Это значит то, что консольные приложения надо запускать из консоли, а не из винды, и тогда окошко закрываться не будет
Цитата Сообщение от Japanese
Если так, то почему же у меня закрывается при использовании
C++
1
return 0;
?
Она закрывается не из-за этой строки, а из-за того, что программа завершает свою работу. Увидел ты результат или нет - это уже никого не волнует
0
silent_1991
Эксперт С++
4984 / 3041 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
19.11.2010, 11:05 #3
И вообще, хотя если программа не наталкивается на return 0;, она и считает, что завершилась успешно, всё же стоит явно возвращать код завершения. Заменять не надо было, надо было вставить перед return 0; вашу _getch(); А вообще в плюсах лучше бы использовать std::cin.get();, хотя бы потому, что отпадает необходимость подключать лишний хидер.
0
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
19.11.2010, 14:17 #4
Цитата Сообщение от silent_1991 Посмотреть сообщение
стоит явно возвращать код завершения.
Ты что имеешь в виду? Если exit, то он в плюсплюсе не приветствуется.
0
Nick Alte
Эксперт С++
1639 / 1011 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
19.11.2010, 17:22 #5
Он имеет в виду return в main. Оно передаёт код возврата не хуже exit.
0
ISergey
Maniac
Эксперт С++
1376 / 887 / 53
Регистрация: 02.01.2009
Сообщений: 2,663
Записей в блоге: 1
19.11.2010, 17:55 #6
return это просто возврат из функции в основной код, а не передача кода возврата (хотя для main можно и так сказать )..

В коде примерно так
Функция маин
Assembler
1
2
3
4
5
;код функции.
;...
;return 0;
xor eax, eax ; это 
ret            ; return 0;
После return попадем в основной код..
Assembler
1
2
3
4
5
6
7
8
9
...
call main              ; здесь вызвали main
add esp, что там.. ; сюда после ret кинет
...
mov [mainret], eax ; запишет значение которое вернула функция main
...
push eax ; eax просто не менялся
call exit   ; вызвали exit(0);
; дальше в ntdll.dll скорее всего попадем и там программа умрет..
exit(0) или ExitProcess(0) окончательный выход из программы..
Для С++ не желательно их явно вызывать т. к. деструкторы классов не будут вызваны..

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
 
class foo{
public:
    foo() { std::cout << "foo::foo()\n"; }
    ~foo() { std::cout << "foo::~foo()\n"; }
};
int main()
{
    foo a;
 
    exit(0);
 
    return 0;
}
На экране только это увидим..
foo::foo()
2
Nick Alte
Эксперт С++
1639 / 1011 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
19.11.2010, 19:49 #7
Так почему бы тогда в этой раззамечательной лекции не написать и о том, что мы можем не только увидеть что-то на экране, но и получить значение кода возврата в переменной окружения %ERRORLEVEL% и даже использовать его - и это всё после того, как программа уже завершилась? И что этот самый код задаётся не только через тот самый нежелательный вызов exit, но и при выполении return внутри main, о чём вам впустую твердят уже который пост?
0
Ntsket
2 / 2 / 0
Регистрация: 20.11.2010
Сообщений: 19
20.11.2010, 05:40 #8
Japanese,
По такой же книжечке занимаюсь, там после кода программы автор как раз описывает проблему с "закрыванием" и после описания проблемы и ее причинах говорит, что нужно добавить еще кусок кода перед оператором return, выглядит этот кусок примерно так (под рукой книжки нет):
C++
1
2
char response;
std::cin >> response;
0
M128K145
21.11.2010, 16:58
  #9
 Комментарий модератора 
Обсуждение литературы не в этой теме.
А принцип "Не читал, но осуждаю" на форуме не приветствуется
0
tabber
36 / 40 / 1
Регистрация: 10.10.2010
Сообщений: 364
21.11.2010, 19:30 #10
Japanese,
Во первых, надо в таком случае построить приложение, и запустить его без откладки!
поскольку вы компилируете файл не для конечного результа и в среде он сам захлопывается поскольку все сделал и ему ** что дальше=)
Ну если вам всеже надо с откладкой то вставь после ретурна -
C++
1
system ("Pause")
Вам книжку по английскому языку сначала надо D тут ежик поймет что ретур это возврат=)
C++
1
2
3
#include "stdafx.h"
#include <iostream>
#include <conio.h>
зачем вы ставите .h если указали область видимости std!?
C++
1
using namespace std;
0
Nameless One
Эксперт С++
5775 / 3425 / 255
Регистрация: 08.02.2010
Сообщений: 7,448
22.11.2010, 03:51 #11
Цитата Сообщение от tabber Посмотреть сообщение
зачем вы ставите .h если указали область видимости std!?
А это тут к чему? Если ты намекаешь, что в С++ стандартные хедеры без расширения, то хочу заметить, что для сишного conio.h нет аналога в С++
0
22.11.2010, 03:51
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.11.2010, 03:51
Привет! Вот еще темы с ответами:

Что делать? Как запустить "Hello, world" в minGW? - C++
Имеется вот такая штука в блокнотике: #include &lt;iostream&gt; using namespace std; int main(int argc, char* argv) { count &lt;&lt;...

Как написать простейший пример "Hello World" на C++ в Visual Studio 2008? - C++
Всем привет. Подскажите пожалуйста, как написать простейший Hello World на C++ в Visual Studio 2008? Я создаю проект кансольного...

Помощь с ошибками в коде программы "Hello world" - C++
Я новичек, так что кривой немного. В общем хотел поставить себе среду Microsoft Visual C++ 6.0, но когда хочу скомпилировать какой-либо...

Прикол: Эволюция программиста на примере "Hello world" - C++
Эволюция программиста 1. Старший курс школы. 10 PRINT 'HELLO WORLD' 20 END 2. Младший курс института. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru