Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
42
Добавлен:
17.03.2016
Размер:
118.52 Кб
Скачать

Структура языка 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, лишенном директив препроцессора.