KnigaRead.com/

Ирина Козлова - Программирование

На нашем сайте KnigaRead.com Вы можете абсолютно бесплатно читать книгу онлайн Ирина Козлова, "Программирование" бесплатно, без регистрации.
Перейти на страницу:

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

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

Ключевыми словами называются зарезервированные идентификаторы, наделенные определенным смыслом. Их можно применять только в соответствии со значением, известным компилятору языка СИ.

Приведем список ключевых слов:

auto double int struct break else long switch register tupedef char extern return void case float unsigned default for signed union do if sizeof volatile continue enum short while.

При этом в определенных версиях реализации языка СИ зарезервированными словами являются следующие: asm, fortran, near, far, cdecl, huge, pascal, interrupt.

Ключевые слова far, huge, near дают возможность определить размеры указателей на области памяти. Ключевые слова asm, cdecl, fortran, pascal используются для организации связи с функциями, которые написаны на других языках, а также для применения команд языка ассемблера непосредственно в теле будущей программы на языке СИ. Ключевые слова не могут применяться в качестве идентификаторов.

12. Комментарии. Исходные файлы

Комментарием является набор символов, игнорируемых компилятором. Но на данный набор символов накладываются определенные ограничения. Внутри набора символов, представляющих комментарий, не может быть специальных символов, которые определяют начало и конец комментариев, соответственно (/* и */). Важно показать, что комментарии способны заменить одну или несколько строк.

Приведем конкретные примеры:

/* комментарии к программе */

/* начало алгоритма */

или /*

Комментарии могут быть записаны в любом виде, но следует быть осторожным и не допустить внутри последовательности, которая игнорируется компилятором, появления оператора программы, который также будет игнорироваться */. При этом производится неправильное определение комментариев.

/* комментарии к алгоритму /* решение краевой задачи */ */

или

/* комментарии к алгоритму решения */ краевой задачи */

Обычная СИ-программа является определением функции main, которая для выполнения определенных действий вызывает другие функции. Связь между функциями производилась по данным через передачу параметров и возврата значений функций. Однако компилятор языка СИ дает возможность также разбить программу на несколько отдельных частей, которые являются исходными файлами, оттранслировать любую часть отдельно и после этого объединить все части в один выполняемый файл при помощи редактора связей. При данной структуре исходной программы функции, располагающиеся в разных исходных файлах, могут применять глобальные внешние переменные. Все функции в языке СИ по определению внешние и постоянно доступны из каждого файла. Для выполнения определяемой функцией каких-либо действий она должна применять переменные. В языке СИ все переменные объявляются до их применения. Объявления определяют соответствие имени и атрибутов переменной, функции или типа. Определение переменной приводит к выделению памяти для хранения ее значения. Класс отводимой памяти определяется спецификатором вида памяти и задает время жизни и область видимости переменной, которые связаны с понятием блока программы. В СИ блоком является ряд объявлений, определений и операторов, располагающихся в фигурных скобках.

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

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

13. Область видимости

Областью при видимости называется часть текста программы, в которой может быть использован определенный объект. Объект является видимым в блоке или в исходном файле, когда в данном блоке или файле определены имя и тип объекта. Объект может быть видимым внутри блока, исходного файла или в каждом исходном файле, образующем программу. Это определяется тем, на каком уровне объявлен объект: на внутреннем (внутри определенного блока) или на внешнем (вне всех блоков). Когда объект объявлен внутри блока, он является видимым в данном блоке и в каждом внутреннем блоке. Когда объект объявлен на внешнем уровне, он является видимым от точки его объявления до завершения этого исходного файла. Объект можно сделать глобально видимым с помощью определенных объявлений во всех исходных файлах, образующих программу. Спецификатором класса памяти в объявлении переменной может быть auto, register, static или extern. Если класс памяти определен, он определяется по умолчанию из контекста объявления. Объекты, принадлежащие классам auto и register, обладают локальным временем жизни. Спецификаторы static и extern задают объекты, обладающие глобальным временем жизни. В случае объявления переменной на внутреннем уровне можно применить любой из четырех спецификаторов класса памяти, а если его не указали, то подразумевается auto. Переменная с классом памяти auto обладает локальным временем жизни и видна только в блоке, в котором объявлена. Память для данной переменной выделяется при входе в блок и высвобождается при выходе из блока. В случае повторного входа в блок этой переменной может быть выделен другой участок памяти. Переменная класса auto автоматически не инициализируется, так как она должна быть проинициализирована явно в случае объявления через присвоение ей начального значения. Значение неинициализированной переменной, класс памяти которой auto, считается неопределенным.

Спецификатор класса памяти register заставляет компилятор распределить память для переменной в регистре, если это возможно. Употребление регистровой памяти чаще всего приводит к сокращению времени доступа к переменной. Переменная, которая объявлена с классом памяти register, обладает той же областью видимости, что и переменная auto. Количество регистров, которые можно применить для значений переменных, не безгранично, так как не безграничны и возможности компьютера. В случае когда компилятор не обладает свободными регистрами, переменной выделяется память как для класса auto. Класс памяти register может указываться для переменных с типом int или указателей с размером, равным размеру int. Переменные, которые объявлены на внутреннем уровне со спецификатором класса памяти static, дают возможность сохранить вид переменной при выходе из блока и применять ее при повторном входе в блок. Данная переменная обладает глобальным временем жизни и областью видимости внутри блока, в котором она объявлена. Для переменных с классом static память выделяется в сегменте данных. В отличие от них переменные класса auto имеют память, которая выделяется в стеке. Исходя из этого, значение переменных с классом static сохраняется при выходе из блока.

14. Объявление переменной на внутреннем уровне с классом памяти static

В качестве примера рассмотрим объявление переменной i на внутреннем уровне с классом памяти static.

исходный файл filel.с

main()

{

}

fun1()

{static int i = 0; исходный файл file2.c fun2()

{static int i = 0; }

fun3()

{static int i = 0; }

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

Переменные класса памяти static способны быть инициализированными константным выражением. Когда явной инициализации нет, то данной переменной присваивается нулевое значение. В случае инициализации константным адресным выражением 14б можно применять адреса любых внешних объектов, кроме адресов объектов, для которых класс памяти auto, так как их адрес не является константой и меняется при любом входе в блок. Инициализация осуществляется один раз при первом входе в блок.

Перейти на страницу:
Прокомментировать
Подтвердите что вы не робот:*