Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
3 / 3 / 2
Регистрация: 06.11.2011
Сообщений: 38
1

Вопросы по теории

06.11.2011, 10:42. Показов 2000. Ответов 24
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, уважаемые участники форума. Начинаю изучать программирование и язык 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 наверное включит всё содержимое файла?

Извиняюсь, если что-то непонятно спросил. Заранее спасибо за ответы.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.11.2011, 10:42
Ответы с готовыми решениями:

Вопросы по теории C++
Есть несколько вопросов по теории C++ 1)Что такое функция пользователя 2)Как инициализировать...

вопросы по теории
помогите ответить на вопросы по теории!! Тема - СТРУКТУРЫ 1) способы обьявления струкутрных...

Вопросы по теории
1)Как узнать -- есть у переменной дробная часть или нет? 2)Как из Integer сделать Extended?

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

24
Higher
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
06.11.2011, 10:49 2
Цитата Сообщение от Abendstern Посмотреть сообщение
Допустим, << это оператор?
Да.
Цитата Сообщение от Abendstern Посмотреть сообщение
или вся строка будет называться оператором?
Нет.
Вообще найдите список операторов с++, понятнее станет.

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

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

То что 0 по умолчанию возвращается, это я уже понял, ага. Но если я напишу return 1, например, то с виду вроде ничего не изменится. По крайней мере, ОС не завопит: "ай-ай, прога поломалась" Так что не совсем понятно, зачем сообщать ОС, как прога завершилась...
0
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,113
Записей в блоге: 2
06.11.2011, 11:06 4
Цитата Сообщение от Abendstern Посмотреть сообщение
Но если я напишу return 1, например, то с виду вроде ничего не изменится. По крайней мере, ОС не завопит: "ай-ай, прога поломалась" Так что не совсем понятно, зачем сообщать ОС, как прога завершилась...
Например у тебя есть две программы, они должны запускаться по очереди, т.е. вторая запускается после завершения работы первой. Работа второй программы зависит от того, как завершилась первая. Если первая вернула 0, значит вторая запускается, если не 0, значит в первой возникла какая то ошибка, и второй запускаться нет смысла.
Наглядный пример компилятор и линкер, если компилятор вернет не 0, то линкер не будет запущен.

Добавлено через 53 секунды
Цитата Сообщение от Abendstern Посмотреть сообщение
а как тогда правильно назвать всю строку, завершённую точкой с запятой? инструкцией? выражением? или как-то по-другому?
называй ее "строка", ошибки не будет)
1
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
06.11.2011, 12:35 5
Цитата Сообщение от Abendstern Посмотреть сообщение
Как я понимаю, iostream - это заголовочный файл? Кстати, интересно, почему он вообще без расширения, какой это имеет смысл?
Да. Никакого. Заголовочные файлы стандартной библиотеки без расширения - это требования актуального стандарта. Но с тем же успехом можно было бы назвать заголовочный файл iostream так: iostream.h, iostream.header, iostream.exe. Препроцессору нет никакого дела до того, какое расширение у файла: он произведет препроцессорную подстановку любого файла, который передан аргументом к директиве #include
1
Эксперт С++
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
06.11.2011, 14:10 6
Abendstern, со словами "оператор" и "операция" существует некоторая путаница.
В английском языке есть слово operator. В старые добрый времена этот термин переводили как "операция" (в смысле, например, арифметическая операция, логическая операция).
Управляющие структуры в английском языке обычно назывались statement (утверждение, предложение). И в старые добрые времена этот термин переводили как "оператор" (в смысле оператор цикла, условный оператор). В настоящее время термин statement все чаще переводят как "инструкция".
1
Диссидент
Эксперт C
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
06.11.2011, 14:27 7
Abendstern, очень важно понять, что #include просто вставляет указанный файл в указанное место (ну, после всякой легкой препроцессорной обработки). Как правило, там содержатся всякие объявления функций, структур, типов данных и прочее, что нужно знать транслятору, чтобы разобраться в твоем коде. Иногда там для твоей конкретной проги есть вещи ненужные, но транслятор не считает обременительным лишние знания.
На линковку это никак не влияет. Линковщик просто ищет в стандартной библиотеке нужные подпрограммы, а ежели вдруг не найдет - кричит караул. Например в Линуксе подключение #include некоторых библиотек не дает собраться программе, если не укажешь явно эти библиотеки.
1
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
06.11.2011, 15:13 8
Цитата Сообщение от Байт Посмотреть сообщение
Например в Линуксе подключение #include некоторых библиотек не дает собраться программе, если не укажешь явно эти библиотеки.
ну это не только в Линуксе (или ты говоришь именно про стандартную библиотеку?)
0
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
06.11.2011, 15:19 9
ну идея еще в том, что стандартные хедеры могут вообще не быть файлами
во всяком случае стандарт не обязывает их присутствовать физически
0
Диссидент
Эксперт C
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
06.11.2011, 16:45 10
Цитата Сообщение от alex_x_x Посмотреть сообщение
ну идея еще в том, что стандартные хедеры могут вообще не быть файлами
во всяком случае стандарт не обязывает их присутствовать физически
Не понял. Нельзя ли пояснить?
0
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
06.11.2011, 16:54 11
Цитата Сообщение от Байт Посмотреть сообщение
Не понял. Нельзя ли пояснить?
хедер может существовать только в воображении компилятора
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12458 / 7482 / 1753
Регистрация: 25.07.2009
Сообщений: 13,762
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> вполне нормальным образом отрабатывает...
2
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
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).
те может быть не файлом, но имя его придерживается правил именования файлов
2
3 / 3 / 2
Регистрация: 06.11.2011
Сообщений: 38
06.11.2011, 17:19  [ТС] 14
Всем спасибо за пояснения, буду разбираться дальше.

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

Не по теме:

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



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

И ещё раз повторю один из вопросов: раз уж мы подключаем только хедеры, где-то же должны находиться реализации конкретных функций? Иными словами, где лежит сама эта стандартная библиотека и чем она представлена?
0
Диссидент
Эксперт C
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
06.11.2011, 17:21 15
Цитата Сообщение от easybudda Посмотреть сообщение
Тонкостей того, откуда что берётся, не знаю, но по сути действительно так. К примеру как ни искал в CygWin-овском /usr/include файл unistd.h, так и не нашёл, при этом gcc встретив в программе #include <unistd.h> вполне нормальным образом отрабатывает...
Любопытно... Т.е. компилятор, чтоб не мучиться, какие-то популярные хедеры держит в себе, т.е оптимизирует обращение к диску? Ну что ж, честь ему и хвала. Но для ТС, ИМХО, лучше представлять себе, что это подстановка текста из файла. А то, что он подставляется не совсем привычным образом, так чего только эти программисты не напридумают!
0
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
06.11.2011, 17:27 16
Цитата Сообщение от Abendstern Посмотреть сообщение
транслятор это то же самое что компилятор
компилятор - одна из разновидностей трансляторов

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

Цитата Сообщение от Abendstern Посмотреть сообщение
Итак, правильно я понимаю, директива препроцессора include вставляет текст подключаемого файла полностью, а вот на этапе линковки используется код только нужных функций?
в с/с++ есть два разных важных понятия - объявление и определение, если вы поймете что это такое - все станет ясным
так вот header'ы используют для объявления, .c, .cpp используют для определения функций
объявления нужны компилятору, чтобы правильно собирать отдельные модули (выставлять заглушки на неопределенные внешние функции)
линковщик занимается тем, что разрешает все эти связи между модулями
под модулями я понимаю скомипилированные единицы трансляции .c, .cpp -> .o, .obj
2
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
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
0
3 / 3 / 2
Регистрация: 06.11.2011
Сообщений: 38
06.11.2011, 18:22  [ТС] 18
alex_x_x, ну... разницу между объявлением и определением я понимаю. Но вот что хочу прояснить:

Допустим, я имею уже скомпилированный модуль и к нему заголовочный файл с объявлениями. В своей проге я использую только какую-нибудь одну маленькую функцию. Смею предположить, что из всего многообразия функций и классов этого модуля, в исполняемый файл попадёт код только "нужной" функции?
0
Диссидент
Эксперт C
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
06.11.2011, 18:42 19
Цитата Сообщение от Abendstern Посмотреть сообщение
alex_x_x, ну... разницу между объявлением и определением я понимаю. Но вот что хочу прояснить:

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

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

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

Ежели вы используете какую-нибудь функцию, объявленную в заголовочном файле, то в ваш объектный файл включается другой объектный файл, в котором находится код этой функции, если компоновка с библиотекой у вас статическая. Этот объектный файл может содержать все функции из заголовочного файла или только выборочные. То есть объявления функций в заголовочном файле может быть разбито на несколько объектных файлов.
То есть когда у вас есть вызов некоторой функции, то компилятор лезет в библиотечный файл (не путать с заголовочным файлом, где находятся лишь объявления фукнц3ий), и в этом библиотечном файле ищет объектный модуль, содержащий объектный код функции.
1
06.11.2011, 18:43
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.11.2011, 18:43
Помогаю со студенческими работами здесь

Вопросы по теории, синтаксису, мышлению.
Добрый день. Скажу сразу. Я прочитал, читаю, собираюсь читать несколько книг по теме. Написал...

Когда вопросы кончаются, сделать кнопку неактивной и вывести сообщение о том, что вопросы кончились
Кто знает ребят подскажите в чем проблема, есть метод обновляющий текст в TextView (всего 6...

по теории
Привет. Подскажите пожалуйста несколько ответов на вопросы, например: 1. правильно я понимаю, что...

Немного теории
хочу освоить немного openGL стал гуглить, сейчас в теме хочу прояснить для себя немного теорию....


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru