Комментарии работы программы

Как видно из рисунка 6, программа выводит на печать строку текста Hello World. Любая программа на Си состоит из функций. Функции содержат операторы – команды для выполнения определенных вычислительных операций. Функции Си аналогичны подпрограммам и функциям других языков программирования, например, Паскаль. Функциям можно давать любые имена по желанию программиста, за исключением функции main. Функция main есть точка входа в приложение. Программа, которая должна выполняться как приложение, должна содержать функцию main, которая при запуске приложения, начинает выполняться последовательно, оператор за оператором (кроме приложений могут создаваться библиотеки функций, которые функцию main не содержат). Из функции main могут вызываться любые другие функции, некоторые из которых программист может написать сам, а другие содержатся в стандартных библиотеках функций.

В первой строчке программы записано следующее:

#include <stdio.h>

Это директива препроцессора, которая подключает к программе заголовочный файл stdio.h (вставляет в данное место текст из этого файла), это обычный текстовый файл, который содержит заголовки (описания) стандартных функций ввода вывода. Следующая строка:

void main()

содержит заголовок функции main, данная функция не имеет возвращаемого значения (тип void, что означает «пустой») и не имеет параметров (пустые круглые скобки). Операторы функции заключены в фигурные скобки, функция main содержит один оператор – вызов стандартной функции printf. Чтобы вызвать функцию, следует ввести ее имя, а затем список аргументов в круглых скобках. Функция printf вызывается с аргументом "Hello World". Функция printf входит в стандартную библиотеку ввода- вывода и выводит свои аргументы на печать, в данном случае это один аргумент в виде строки текста в кавычках (строковая константа).

 

Последовательность обработки программы на Си

Рассмотрим последовательность обработки файлов (файла) с исходным кодом на языке Си (Си++), файлов с расширением .c (.cpp) и превращения их в файл с исполняемым кодом (с расширением .exe) в операционных системах Windows. Последовательность обработки представлена на рисунке 7.

 

Препроцессор
   
   
Исходный текст, файлы с расширением.c.cpp.h  
Компилятор
   
   
Объектный код (файлы.obj)
Компоновщик (редактор связей)
Исполняемый код (файл.exe)
   
   
Обработанный препроцессором текст (.c.cpp)  

 

 


Рисунок 7 – Последовательность обработки программы на языки Си (Си++)

 

Прокомментируем данный рисунок. На входе имеем некоторые файлы (один или несколько) с исходным кодом языка Си (Си++) (обычные текстовые файла в кодировке, принятой в операционной системе), файлы могут иметь расширения .c,.cpp,.h и др. Первоначально файлы обрабатываются специальной программой, называемой препроцессор. (Как правило, препроцессор является не отдельной программой, а входит в состав другой программы – компилятор, но стадия препроцессорной подготовки обычно рассматривается отдельно от компиляции). При препроцессорной обработке выполняются директивы препроцессора, например, директива include (включение файла), из исходного текста удаляются комментарии и выполняются некоторые другие действия. В итоге получаем файлы после препроцессорной обработке условно можно считать, что это файлы с расширениями.c или.cpp (следует отметить, что эти файлы не сохраняются на диске, а существуют в оперативной памяти, поэтому граница овалов на рисунке является пунктирной). Далее файлы с обработанным препроцессором исходным кодом обрабатываются специальной программой – компилятором. После обработки компилятором, если не выявлено ошибок, создаются файлы с двоичным кодом программы, файлы с расширением .obj (так называемый, объектный код). Далее эти файлы обрабатываются специальной программой, которая называется компоновщиков (Linker) или редактором связей, в результате работы этой программы, если не будет выявлено ошибок, происходит сборка отдельных файлов объектного кода в файл исполняемого кода с расширением .exe. Кроме того, при необходимости в файл исполняемого кода вставляются двоичные коды стандартных библиотечных функций языка Си.

 


Термины

 

Лексема – единица текста программы, имеющая для компилятора самостоятельный смысл.

Идентификатор (имя переменной, функции или другого объекта) – это последовательность букв английского алфавита, десятичных цифр, символа подчеркивания, начинающаяся не с цифры (в некоторых компиляторах, например, Visual C++ разрешается в идентификаторах использовать символ $).

Ключевые слова – это зарезервированные идентификаторы, имеющие специальное значение для компилятора.

Константа – это значение, которое не может быть изменено в процессе работы программа.

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

 

 

Лекция № 2. Базовые типы данных. Объявления переменных

Концепция типа данных

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

Тип данных определяет:

– внутреннее представление данных в памяти компьютера;

– множество значений, которые могут принимать величины этого типа;

– операции и функции, которые можно применять к величинам этого тина.

В языке Си (Си++) существуют стандартные или базовые типы данных и производные типы данных.

 

Базовые типы данных

В Си стандарта ANSI классификация типов имеет следующий вид, также указана размерность переменной типа в оперативной памяти:

• целые:

– беззнаковые:

• unsigned char – переменная типа занимает в памяти 8 бит;

• unsigned short – 16 бит;

• unsigned int - 32 бита (в Win32);

• unsigned long – 32 бита (в Win32);

– знаковые:

• char – 8 бит;

• short – 16 бит;

• int  - 32 бита (в Win32);

• long – 32 бита (в Win32);

• вещественные:

• float – 32 бита;

• double – 64 бита;

• long double – 80 бит.

Назначение и диапазоны стандартных типов представлено в таблице 1.

Таблица 1 – Назначение и диапазоны стандартных типов

Тип данных Размер, бит Диапазон значений Примечание -назначение типа
unsigned char 8 0...255 Небольшие целые числа без знака и коды символов
char 8 -128...127 Небольшие целые числа со знаком и ASCII-коды
unsigned short 16 0...65535 Целые числа без знака
short 16 -32768...32767 Целые числа со знаком
unsigned int 32 0...4294967295 Большие целые без знака
int 32 -2147483648......2147483647 Большие целые со знаком
unsigned long 32 0...4294967295 Большие целые без знака
long 32 -2147483648......2147483647 Большие целые со знаком
float 32 3.4Е-38…...    3.4Е+38 Научные расчеты (7 значащих цифр)
double 64 1.7Е-308... …..1.7Е+308 Научные расчеты (15 значащих цифр)
long double 80 3.4Е-4932......1.1Е+4932 Финансовые расчеты (19 значащих цифр)

Следует отметить особенность типа char (unsigned char) в языке Си. Язык Си язык со слабой типизацией, поэтому символьный тип используется двояко. С одной стороны он может использоваться для хранения кодов символов в кодировке ASCII, а с другой стороны, для хранения целых чисел в заданном диапазоне.

Кроме данных типов в Си существует перечисляемый тип, который задается следующим образом:

enum <имя_типа> {

<имя1>[=<инициализатор1>],

<имя2>[=<инициализатор2>],

……………….

<имяN>[=<инициализаторN>] };

<имя1>, <имя2>, …, <имяN> -выступают далее в качестве констант, по умолчанию первая константа инициализируется 0, каждая последующая на 1 больше. Переменные заданного типа могут принимать значения только из множества констант. Этот тип отдельно в качестве базовых можно не рассматривать, так как он в своем внутреннем представлении в оперативной памяти аналогичен типу int. Данный тип удобно использовать для ассоциации некоторых констант с символьными именами.

Пример:

enum A {

a, //=0

b, //=1

c=5,//=5

d }; //=6

A x;

x=b; // Переменной x можно присваивать значения констант a, b, c или d

Дополнительно компанией Microsoft введены, так называемые, платформенно- независимые целые типы, по сути это новые имена для уже существующих типов, но их размерность не будет меняться при переходе к другим платформам (размерность этих типов в битах явным образом присутствует в названии):

__int8             unsigned __int8

__int16            unsigned __int16

__int32            unsigned __int32

__int64            unsigned __int64

Кроме того в последние версии продуктов Microsoft дополнительно введены следующие типы, имена которых являются ключевыми словами:

bool – 1 байт, возможные значения true (1) и false (0);

wchar_t – 2 байта (соответствует типу short), обычно используется для хранения кодов символов в кодировке Unicode (1 символ кодируется 2 байтами).

 

Атрибуты объектов

Под объектом в данном случае понимается поименованная область памяти (переменная, функция, массив и т.п.)‏. В данном подразделе материал большей частью посвящен переменным хотя многое применимо к другим типам объектов.

Кроме типов для объектов или переменных явно или по умолчанию определяются следующие атрибуты:

– класс памяти;

– область (сфера) действия, связанного с объектом идентификатора (имени);

– область видимости объекта;

– продолжительность существования объекта;

– тип компоновки (связывания).

 

Класс памяти

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

Для явного задания классов памяти используются следующие модификаторы:

1. auto – автоматическая или локальная память. Память под переменную с этим модификатором выделяется в стеке каждый раз при выполнении оператора, содержащего определение переменной. Освобождение памяти происходит при выходе из блока, в котором определена переменная. Время ее жизни — с момента описания до конца блока. Для глобальных переменных (переменных, объявленных вне блока), этот спецификатор не используется, а для локальных он принимается по умолчанию, поэтому задавать его явным образом большого смысла не имеет.

Блок – это последовательность объявлений, определений и операторов, заключенных в фигурные скобки {…}. Выделяют два типа блоков: составной оператор и тело функции.

2. register – регистровая память, аналогично auto, но память выделяется по возможности в регистрах процессора. Если такой возможности у компилятора нет, переменные обрабатываются как auto.

3. static – «статическая» память, внутренний тип компоновки, т.е. переменная доступна только в одном файле проекта, где она определена и статическая продолжительность существования, т.е. переменная существует в течение всего времени выполнения программы. Инициализируется один раз при первом выполнении оператора, содержащего определение переменной.

4. extern – «внешняя» память, внешний тип компоновки, т.е. переменная доступна во многих файлах проекта, и статическая продолжительность существования.

Если класс памяти явно не определен, то для переменных, определенных вне блоков класс памяти – extern, а для определенных внутри блоков – auto.

 


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: