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

Вопросы по теории - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.90
Abendstern
3 / 3 / 0
Регистрация: 06.11.2011
Сообщений: 38
06.11.2011, 10:42     Вопросы по теории #1
Здравствуйте, уважаемые участники форума. Начинаю изучать программирование и язык C++ в частности. И сразу же появились вопросы, теоретического так скажем плана. Задам их, допустим, на примере всеми любимого хелловорда (а на большее я пока и не способен ):

C++
1
2
3
4
5
6
7
8
9
#include <iostream>
 
int main()
{
    std::cout << "Hello people!\n";
 
    system("pause");
    return 0;
}
1. Сначала немного о терминологии, я если честно, запутался немного, что такое оператор, операция, выражение, ещё встречал термин инструкция... Дабы в дальнейшем грамотно изъясняться, я бы хотел прояснить этот момент. Допустим, << это оператор? или вся строка будет называться оператором?

2. Какую смысловую нагрузку имеет выражение return 0 ? Зачем возвращать что-то операционной системе, и как она будет использовать это значение? Всякой ли ОС оно вообще нужно?

3. Как я понимаю, iostream - это заголовочный файл? Кстати, интересно, почему он вообще без расширения, какой это имеет смысл? И если это только заголовочный файл, то где находится реализация описанных в нём методов, в частности операторов <<, >> ?

4. И вообще, насчёт подключения файлов... В исполняемом файле связывается объектный код, написанной мною проги и объектный код из стандартной библиотеки? Туда включается вся-вся информация из подключаемого файла? Или только тот фрагмент, который касается используемых мною функций? Т.е. в примере выше, я использую лишь оператор вывода, а ввод мне не нужен. Избыточная информация об операторе >> вроде как не нужна. Но с другой стороны, директива include наверное включит всё содержимое файла?

Извиняюсь, если что-то непонятно спросил. Заранее спасибо за ответы.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.11.2011, 10:42     Вопросы по теории
Посмотрите здесь:

вопросы по теории C++
Вопросы по С++ C++
C++ Вопросы по C++
Немного теории C++
немного теории C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
06.11.2011, 10:49     Вопросы по теории #2
Цитата Сообщение от Abendstern Посмотреть сообщение
Допустим, << это оператор?
Да.
Цитата Сообщение от Abendstern Посмотреть сообщение
или вся строка будет называться оператором?
Нет.
Вообще найдите список операторов с++, понятнее станет.

Цитата Сообщение от Abendstern Посмотреть сообщение
Какую смысловую нагрузку имеет выражение return 0
В данном случае никакую, main возвращает 0 по умолчанию.

Цитата Сообщение от Abendstern Посмотреть сообщение
Зачем возвращать что-то операционной системе
Как минимум чтобы узнать, нормально ли завершилась программа. Если программа возвращает 0 - то нормально. Может, еще для чего-нибудь нужно.
Abendstern
3 / 3 / 0
Регистрация: 06.11.2011
Сообщений: 38
06.11.2011, 11:01  [ТС]     Вопросы по теории #3
diagon,
Спасибо, а как тогда правильно назвать всю строку, завершённую точкой с запятой? инструкцией? выражением? или как-то по-другому?

То что 0 по умолчанию возвращается, это я уже понял, ага. Но если я напишу return 1, например, то с виду вроде ничего не изменится. По крайней мере, ОС не завопит: "ай-ай, прога поломалась" Так что не совсем понятно, зачем сообщать ОС, как прога завершилась...
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
06.11.2011, 11:06     Вопросы по теории #4
Цитата Сообщение от Abendstern Посмотреть сообщение
Но если я напишу return 1, например, то с виду вроде ничего не изменится. По крайней мере, ОС не завопит: "ай-ай, прога поломалась" Так что не совсем понятно, зачем сообщать ОС, как прога завершилась...
Например у тебя есть две программы, они должны запускаться по очереди, т.е. вторая запускается после завершения работы первой. Работа второй программы зависит от того, как завершилась первая. Если первая вернула 0, значит вторая запускается, если не 0, значит в первой возникла какая то ошибка, и второй запускаться нет смысла.
Наглядный пример компилятор и линкер, если компилятор вернет не 0, то линкер не будет запущен.

Добавлено через 53 секунды
Цитата Сообщение от Abendstern Посмотреть сообщение
а как тогда правильно назвать всю строку, завершённую точкой с запятой? инструкцией? выражением? или как-то по-другому?
называй ее "строка", ошибки не будет)
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
06.11.2011, 12:35     Вопросы по теории #5
Цитата Сообщение от Abendstern Посмотреть сообщение
Как я понимаю, iostream - это заголовочный файл? Кстати, интересно, почему он вообще без расширения, какой это имеет смысл?
Да. Никакого. Заголовочные файлы стандартной библиотеки без расширения - это требования актуального стандарта. Но с тем же успехом можно было бы назвать заголовочный файл iostream так: iostream.h, iostream.header, iostream.exe. Препроцессору нет никакого дела до того, какое расширение у файла: он произведет препроцессорную подстановку любого файла, который передан аргументом к директиве #include
ValeryLaptev
Эксперт C++
1005 / 784 / 46
Регистрация: 30.04.2011
Сообщений: 1,595
06.11.2011, 14:10     Вопросы по теории #6
Abendstern, со словами "оператор" и "операция" существует некоторая путаница.
В английском языке есть слово operator. В старые добрый времена этот термин переводили как "операция" (в смысле, например, арифметическая операция, логическая операция).
Управляющие структуры в английском языке обычно назывались statement (утверждение, предложение). И в старые добрые времена этот термин переводили как "оператор" (в смысле оператор цикла, условный оператор). В настоящее время термин statement все чаще переводят как "инструкция".
Байт
 Аватар для Байт
13988 / 8819 / 1230
Регистрация: 24.12.2010
Сообщений: 15,975
06.11.2011, 14:27     Вопросы по теории #7
Abendstern, очень важно понять, что #include просто вставляет указанный файл в указанное место (ну, после всякой легкой препроцессорной обработки). Как правило, там содержатся всякие объявления функций, структур, типов данных и прочее, что нужно знать транслятору, чтобы разобраться в твоем коде. Иногда там для твоей конкретной проги есть вещи ненужные, но транслятор не считает обременительным лишние знания.
На линковку это никак не влияет. Линковщик просто ищет в стандартной библиотеке нужные подпрограммы, а ежели вдруг не найдет - кричит караул. Например в Линуксе подключение #include некоторых библиотек не дает собраться программе, если не укажешь явно эти библиотеки.
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
06.11.2011, 15:13     Вопросы по теории #8
Цитата Сообщение от Байт Посмотреть сообщение
Например в Линуксе подключение #include некоторых библиотек не дает собраться программе, если не укажешь явно эти библиотеки.
ну это не только в Линуксе (или ты говоришь именно про стандартную библиотеку?)
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
06.11.2011, 15:19     Вопросы по теории #9
ну идея еще в том, что стандартные хедеры могут вообще не быть файлами
во всяком случае стандарт не обязывает их присутствовать физически
Байт
 Аватар для Байт
13988 / 8819 / 1230
Регистрация: 24.12.2010
Сообщений: 15,975
06.11.2011, 16:45     Вопросы по теории #10
Цитата Сообщение от alex_x_x Посмотреть сообщение
ну идея еще в том, что стандартные хедеры могут вообще не быть файлами
во всяком случае стандарт не обязывает их присутствовать физически
Не понял. Нельзя ли пояснить?
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
06.11.2011, 16:54     Вопросы по теории #11
Цитата Сообщение от Байт Посмотреть сообщение
Не понял. Нельзя ли пояснить?
хедер может существовать только в воображении компилятора
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
06.11.2011, 17:02     Вопросы по теории #12
Цитата Сообщение от Nameless One Посмотреть сообщение
или ты говоришь именно про стандартную библиотеку?
К примеру мало написать #include <math.h> (ну или <cmath>), нужно ещё при сборке -lm указать.

Цитата Сообщение от alex_x_x Посмотреть сообщение
ну идея еще в том, что стандартные хедеры могут вообще не быть файлами
во всяком случае стандарт не обязывает их присутствовать физически
Цитата Сообщение от Байт Посмотреть сообщение
Не понял. Нельзя ли пояснить?
Тонкостей того, откуда что берётся, не знаю, но по сути действительно так. К примеру как ни искал в CygWin-овском /usr/include файл unistd.h, так и не нашёл, при этом gcc встретив в программе #include <unistd.h> вполне нормальным образом отрабатывает...
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
06.11.2011, 17:02     Вопросы по теории #13
17.4.1.2 Headers
1 The elements of the C++ Standard Library are declared or defined (as appropriate) in a header (158)
(158) A header is not necessarily a source file, nor are the sequences delimited by < and > in header names necessarily valid source file names (16.2).
те может быть не файлом, но имя его придерживается правил именования файлов
Abendstern
3 / 3 / 0
Регистрация: 06.11.2011
Сообщений: 38
06.11.2011, 17:19  [ТС]     Вопросы по теории #14
Всем спасибо за пояснения, буду разбираться дальше.

Байт, не могли бы пояснить, транслятор это то же самое что компилятор? Вообще в википедии пишут, что компилятор состоит из транслятора и компоновщика. Хм, но в книгах обычно понятия разнесены по отдельности, именно компилятор и компоновщик. Короче говоря, путаница с этими понятиями

Не по теме:

Может быть то что я спрашиваю, не так уж существенно (хотя, не мне пока судить), просто хочется сразу овладеть корректной терминологией, чтобы не было недопониманий при общении с программистами



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

И ещё раз повторю один из вопросов: раз уж мы подключаем только хедеры, где-то же должны находиться реализации конкретных функций? Иными словами, где лежит сама эта стандартная библиотека и чем она представлена?
Байт
 Аватар для Байт
13988 / 8819 / 1230
Регистрация: 24.12.2010
Сообщений: 15,975
06.11.2011, 17:21     Вопросы по теории #15
Цитата Сообщение от easybudda Посмотреть сообщение
Тонкостей того, откуда что берётся, не знаю, но по сути действительно так. К примеру как ни искал в CygWin-овском /usr/include файл unistd.h, так и не нашёл, при этом gcc встретив в программе #include <unistd.h> вполне нормальным образом отрабатывает...
Любопытно... Т.е. компилятор, чтоб не мучиться, какие-то популярные хедеры держит в себе, т.е оптимизирует обращение к диску? Ну что ж, честь ему и хвала. Но для ТС, ИМХО, лучше представлять себе, что это подстановка текста из файла. А то, что он подставляется не совсем привычным образом, так чего только эти программисты не напридумают!
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
06.11.2011, 17:27     Вопросы по теории #16
Цитата Сообщение от Abendstern Посмотреть сообщение
транслятор это то же самое что компилятор
компилятор - одна из разновидностей трансляторов

Цитата Сообщение от Abendstern Посмотреть сообщение
ообще в википедии пишут, что компилятор состоит из транслятора и компоновщика.
среда сборки состоит из компилятора и линковщика(некоторые его называют компановщиком)

Цитата Сообщение от Abendstern Посмотреть сообщение
Итак, правильно я понимаю, директива препроцессора include вставляет текст подключаемого файла полностью, а вот на этапе линковки используется код только нужных функций?
в с/с++ есть два разных важных понятия - объявление и определение, если вы поймете что это такое - все станет ясным
так вот header'ы используют для объявления, .c, .cpp используют для определения функций
объявления нужны компилятору, чтобы правильно собирать отдельные модули (выставлять заглушки на неопределенные внешние функции)
линковщик занимается тем, что разрешает все эти связи между модулями
под модулями я понимаю скомипилированные единицы трансляции .c, .cpp -> .o, .obj
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
06.11.2011, 17:34     Вопросы по теории #17
Цитата Сообщение от easybudda Посмотреть сообщение
К примеру мало написать #include <math.h> (ну или <cmath>), нужно ещё при сборке -lm указать
как оказывается (заметил где-то месяц назад), уже и не обязательно:
Код
[nameless@desktop c]$ cat main.c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define TEST(EXP) \
    printf(#EXP " = %.2f\n", EXP)

int main(void)
{
    TEST(exp(3.));
    TEST(sin(3.));
    TEST(cos(3.));
    TEST(log(3.));
        
    exit(EXIT_SUCCESS);
}
[nameless@desktop c]$ cat Makefile | egrep -i '^(c|ld)flags'
CFLAGS= -Wall -ansi -pedantic -pedantic-errors
LDFLAGS= #-lm
[nameless@desktop c]$ make clean && make
rm -fv main.o sample *~
удалён «main.o»
удалён «sample»
gcc -Wall -ansi -pedantic -pedantic-errors   -c -o main.o main.c
gcc -o sample  main.o
[nameless@desktop c]$ ./sample 
exp(3.) = 20.09
sin(3.) = 0.14
cos(3.) = -0.99
log(3.) = 1.10
[nameless@desktop c]$ gcc --version
gcc (GCC) 4.6.1 20110908 (Red Hat 4.6.1-9)
Хотя в манах до сих пор написано про -lm
Abendstern
3 / 3 / 0
Регистрация: 06.11.2011
Сообщений: 38
06.11.2011, 18:22  [ТС]     Вопросы по теории #18
alex_x_x, ну... разницу между объявлением и определением я понимаю. Но вот что хочу прояснить:

Допустим, я имею уже скомпилированный модуль и к нему заголовочный файл с объявлениями. В своей проге я использую только какую-нибудь одну маленькую функцию. Смею предположить, что из всего многообразия функций и классов этого модуля, в исполняемый файл попадёт код только "нужной" функции?
Байт
 Аватар для Байт
13988 / 8819 / 1230
Регистрация: 24.12.2010
Сообщений: 15,975
06.11.2011, 18:42     Вопросы по теории #19
Цитата Сообщение от Abendstern Посмотреть сообщение
alex_x_x, ну... разницу между объявлением и определением я понимаю. Но вот что хочу прояснить:

Допустим, я имею уже скомпилированный модуль и к нему заголовочный файл с объявлениями. В своей проге я использую только какую-нибудь одну маленькую функцию. Смею предположить, что из всего многообразия функций и классов этого модуля, в исполняемый файл попадёт код только "нужной" функции?
Смеете.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.11.2011, 18:43     Вопросы по теории
Еще ссылки по теме:

C++ Вопросы по теории C++
Помощь в теории C++
непонятность по теории C++

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

Или воспользуйтесь поиском по форуму:
Сыроежка
Заблокирован
06.11.2011, 18:43     Вопросы по теории #20
Цитата Сообщение от Abendstern Посмотреть сообщение
alex_x_x, ну... разницу между объявлением и определением я понимаю. Но вот что хочу прояснить:

Допустим, я имею уже скомпилированный модуль и к нему заголовочный файл с объявлениями. В своей проге я использую только какую-нибудь одну маленькую функцию. Смею предположить, что из всего многообразия функций и классов этого модуля, в исполняемый файл попадёт код только "нужной" функции?
Когда вы в свой программный модуль включаете директиву #include, то в исходный текст вашего модуля включаются все объявления, присутствующие в этом заголовочном файле за исключением теХ. которые исключаются с помощью условных директив препроцессора таких, как, например, #ifdef или #ifndef.

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

Ежели вы используете какую-нибудь функцию, объявленную в заголовочном файле, то в ваш объектный файл включается другой объектный файл, в котором находится код этой функции, если компоновка с библиотекой у вас статическая. Этот объектный файл может содержать все функции из заголовочного файла или только выборочные. То есть объявления функций в заголовочном файле может быть разбито на несколько объектных файлов.
То есть когда у вас есть вызов некоторой функции, то компилятор лезет в библиотечный файл (не путать с заголовочным файлом, где находятся лишь объявления фукнц3ий), и в этом библиотечном файле ищет объектный модуль, содержащий объектный код функции.
Yandex
Объявления
06.11.2011, 18:43     Вопросы по теории
Ответ Создать тему
Опции темы

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