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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.87
Japanese
 Аватар для Japanese
9 / 9 / 1
Регистрация: 14.11.2010
Сообщений: 120
19.11.2010, 06:53     Небольшая странность в "Hello World!" #1
Начал изучать 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;
?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
19.11.2010, 07:22     Небольшая странность в "Hello World!" #2
Цитата Сообщение от Japanese Посмотреть сообщение
Так вот мне непонятно одно: если автор написал в своем исходнике
C++
1
return 0;
это значит что у него программа сразу не закрылась?
Это значит то, что консольные приложения надо запускать из консоли, а не из винды, и тогда окошко закрываться не будет
Цитата Сообщение от Japanese
Если так, то почему же у меня закрывается при использовании
C++
1
return 0;
?
Она закрывается не из-за этой строки, а из-за того, что программа завершает свою работу. Увидел ты результат или нет - это уже никого не волнует
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
19.11.2010, 11:05     Небольшая странность в "Hello World!" #3
И вообще, хотя если программа не наталкивается на return 0;, она и считает, что завершилась успешно, всё же стоит явно возвращать код завершения. Заменять не надо было, надо было вставить перед return 0; вашу _getch(); А вообще в плюсах лучше бы использовать std::cin.get();, хотя бы потому, что отпадает необходимость подключать лишний хидер.
volovzi
266 / 168 / 8
Регистрация: 14.03.2010
Сообщений: 501
19.11.2010, 14:17     Небольшая странность в "Hello World!" #4
Цитата Сообщение от silent_1991 Посмотреть сообщение
стоит явно возвращать код завершения.
Ты что имеешь в виду? Если exit, то он в плюсплюсе не приветствуется.
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,897
Завершенные тесты: 1
19.11.2010, 17:22     Небольшая странность в "Hello World!" #5
Он имеет в виду return в main. Оно передаёт код возврата не хуже exit.
ISergey
Maniac
Эксперт С++
 Аватар для ISergey
1330 / 863 / 50
Регистрация: 02.01.2009
Сообщений: 2,622
Записей в блоге: 1
19.11.2010, 17:55     Небольшая странность в "Hello World!" #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()
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,897
Завершенные тесты: 1
19.11.2010, 19:49     Небольшая странность в "Hello World!" #7
Так почему бы тогда в этой раззамечательной лекции не написать и о том, что мы можем не только увидеть что-то на экране, но и получить значение кода возврата в переменной окружения %ERRORLEVEL% и даже использовать его - и это всё после того, как программа уже завершилась? И что этот самый код задаётся не только через тот самый нежелательный вызов exit, но и при выполении return внутри main, о чём вам впустую твердят уже который пост?
Ntsket
 Аватар для Ntsket
2 / 2 / 0
Регистрация: 20.11.2010
Сообщений: 19
20.11.2010, 05:40     Небольшая странность в "Hello World!" #8
Japanese,
По такой же книжечке занимаюсь, там после кода программы автор как раз описывает проблему с "закрыванием" и после описания проблемы и ее причинах говорит, что нужно добавить еще кусок кода перед оператором return, выглядит этот кусок примерно так (под рукой книжки нет):
C++
1
2
char response;
std::cin >> response;
M128K145
21.11.2010, 16:58
  #9
 Комментарий модератора 
Обсуждение литературы не в этой теме.
А принцип "Не читал, но осуждаю" на форуме не приветствуется
tabber
 Аватар для tabber
20 / 37 / 1
Регистрация: 10.10.2010
Сообщений: 364
21.11.2010, 19:30     Небольшая странность в "Hello World!" #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;
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.11.2010, 03:51     Небольшая странность в "Hello World!"
Еще ссылки по теме:

C++ Обучение по книге Страуструпа "принципы и практика C++". Не выводится "Hello, World"
Hello World и ошибка "This function or variable may be unsafe. Consider using strcpy_s instead" C++
Что делать? Как запустить "Hello, world" в minGW? C++

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

Или воспользуйтесь поиском по форуму:
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
22.11.2010, 03:51     Небольшая странность в "Hello World!" #11
Цитата Сообщение от tabber Посмотреть сообщение
зачем вы ставите .h если указали область видимости std!?
А это тут к чему? Если ты намекаешь, что в С++ стандартные хедеры без расширения, то хочу заметить, что для сишного conio.h нет аналога в С++
Yandex
Объявления
22.11.2010, 03:51     Небольшая странность в "Hello World!"
Ответ Создать тему
Опции темы

Текущее время: 08:32. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru