Программирование и основы алгоритмизации УТС / Лекции / 02. Структура языка C
.pdfСтруктура языка C
Структура языка C традиционна для процедурных языков. Основой является алфавит, из символов которого строятся лексемы, которые, в свою очередь, являются элементарными составными частями различных конструкций.
Алфавит
Лексемы
Выражения
Операторы
Описания
Программа
Буквы |
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z |
a b c d e f g h I j k l m n o p q r s t u v w x y z _ |
|
Цифры |
|
|
|
0 1 2 3 4 5 6 7 8 9 |
|
|
|
Знаки + – * / % \ | & ! ? : ; . , = < > ~ ^ { } ( ) [ ] " '
|
Имена переменных, полей, функций |
|
Идентификаторы |
Символические значения перечислений |
|
|
Имена и тэги типов данных |
|
|
|
|
|
|
|
Ключевые слова |
Операторы, встроенные типы данных, |
|
модификаторы, sizeof (операция) |
||
|
||
|
|
|
|
|
|
Константы |
Целочисленные, вещественные, |
|
символьные, строковые |
||
|
||
|
|
|
|
|
|
Операции |
Арифметические, присваивания, |
|
поразрядные, логические, отношения и др. |
||
|
||
|
|
Непечатаемые |
Пробел, табуляция, |
символы |
перевод строки и др. |
|
|
Разделители |
Комментарии |
|
|
|
|||
|
/* … */ |
||||||
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
Операторный блок |
|
|
{ … } |
||
|
|
|
|
|
|
||
|
|
|
|
|
|||
|
|
Оператор-выражение |
|
|
<выражение>; |
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
Операторы передачи |
goto, break, continue, return |
||||
|
|
управления |
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|||
|
|
Условные операторы |
|
|
if, switch |
||
|
|
|
|
|
|||
|
|
|
|
||||
|
|
Операторы циклов |
|
while, do … while, for |
|||
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
Описание типов |
Переименование типов, перечисления, |
|
||||
|
данных |
структуры, объединения |
|
||||
|
Описание |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
Объявление и определение |
|
|||||
|
переменных |
|
|||||
|
|
|
|
|
|
||
|
|
|
|
|
|
||
|
|
|
|
|
|||
|
Описание |
Объявление (прототип) |
|
||||
|
функций |
и определение (реализация) |
|
||||
|
|
|
|
|
|
|
|
Алфавит – это множество символов, которые (и только которые) используются для записи программ. Любые другие символы являются недопустимыми, но это не относится к случаям их использования в качестве данных, например, в символьных и строковых константах. В алфавит языка C также не входит символ #, который используется только в записи директив препроцессора.
Лексема – минимальная единица языка, имеющая самостоятельный смысл. Так, идентификаторы являются именами программных объектов и служат для обращения к ним. Идентификаторы задаются программистом во время написания программы и существуют только в исходном программном коде. Любой идентификатор – это уникальная в своей области определения последовательность символов, состоящая из букв (включая символ подчеркивания) и цифр, начинающаяся не с цифры.
На идентификаторы похожи ключевые слова, которые являются неотъемлемой частью языка и имеют в этом языке строго определенный смысл. Ключевые слова языка C также являются зарезервированными словами и не допускают их использования в какомлибо ином смысле, т.е. в качестве идентификаторов, например, нельзя определить переменную с именем for, т.к. это зарезервированное слово для оператора цикла.
Модификаторами называют ключевые слова, которые сами по себе не служат для построения каких-либо конструкций, но изменяют смысл конструкций, в которых используются. Например, модификатор extern в описании переменной приводит лишь к ее объявлению, тогда как без него эта конструкция станет определением переменной.
Константы – это лексемы, представляющие собой запись некоторых значений, которые могут использоваться в выражениях, но, в отличие от переменных, память для их хранения не выделяется. Для каждого типа данных существует свой определенный способ записи констант. Запись констант числовых типов всегда начинается с цифры, знака («плюс» или «минус») или десятичной точки, символьные константы и строковые литералы заключаются соответственно в одинарные и двойные кавычки – т.е. константы всегда отличить от лексем других типов.
Операциями являются предопределенные в языке действия по обработке данных. Операции, как правило, имеют операнды и возвращают некоторый результат выполнения, который, в свою очередь, может использоваться в качестве операнда другой операции и т.д. Для записи всех операций языка C используются символы, не являющиеся буквами, цифрами и кавычками, кроме операции sizeof, обозначаемой ключевым словом.
Выражениями являются последовательности, состоящие из идентификаторов, констант и операций, записанные в соответствии с правилами использования операций. Выражение предназначено для вычисления некоторого значения и всегда является составной частью либо другого выражения (т.е. подвыражением), либо оператора или описания, в которых это значение используется.
Разделители могут присутствовать между любыми двумя лексемами в любом количестве. В тех случаях, когда слитное написание двух лексем приведет к их неправильной трактовке, разделитель между ними необходим. Все символы-разделители равноправны, поэтому и вся программа (кроме директив препроцессора) может быть написана в одну строку, и один оператор может быть разбит (по лексемам) на несколько – это не играет никакой роли с точки зрения компиляции программы, поэтому разделители используются для повышения читаемости исходного кода. К разделителям также относятся комментарии, содержимое которых игнорируется компилятором, поэтому они могут содержать в себе любые символы, в т.ч. не принадлежащие алфавиту языка. Комментарии могут заключать в себе несколько строк программного кода, но они не могут быть вложенными, т.е. при любом количестве пар символов /*, открывающих комментарий, первая пара */ будет являться его завершением.
Операторы – это законченные действия в программе. В отличие от операций, манипулирующих данными, операторы управляют ходом вычислительного процесса. Все операторы, кроме операторного блока и оператора-выражения, представляют собой конструкции, образованные соответствующими ключевыми словами.
Описания вводят в программный код идентификатор, обозначающий некоторый программный объект (тип данных, переменную или функцию), используемый в программе ниже по тексту. Описания переменных и функций делятся на объявления и определения. Отличие состоит в том, что определение приводит к распределению памяти для хранения значения переменной или размещения машинного кода функции и вычисления адреса, соответствующего этому программному объекту, тогда как объявление только вводит его идентификатор, а память должна распределяться где-то в другом месте программы. Следовательно, для каждого идентификатора должно быть ровно одно определение и может быть любое количество объявлений или их отсутствие. Типы данных, в отличие от переменных и функций, являются абстракциями,
существующими только в исходном программном коде на языке программирования, и не требуют память для их хранения во время выполнения программы, поэтому, строго говоря, к их описаниям неприемлемо применение терминов «объявление» или «определение».
Собственно программа на языке C представляет собой последовательность различных описаний, причем операторы, как действия, выполняемые в программе, могут являться только составной частью реализации функций, а выражения – составной частью описаний и операторов.
В исходный код на языке программирования C могут быть включены (обычно включены) директивы препроцессора – специальные указания текстовому процессору, который выполняет предварительную обработку текста исходной программы перед компиляцией и поэтому называется препроцессором. Каждая директива либо «разворачивается» в конструкции на языке C (например, директивы #include и #define), либо управляет процессом компиляции (директивы условной компиляции #if и др.), либо задает параметры компиляции и сборки исполняемого файла программы (например, директива #pragma). Таким образом, непосредственно компилятор получает исходный код программы на «чистом» языке C, лишенном директив препроцессора.