Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Сабуров С.В. - Язык программирования C и C++ - 2006

.pdf
Скачиваний:
312
Добавлен:
13.08.2013
Размер:
1.42 Mб
Скачать

Язык программирования Си

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

Если список аргументов содержит только многоточие (...), то число аргументов переменно или равно нулю.

Важно: Для поддержки совместимости с предыдущими версиями компилятор воспринимает для обозначения переменного числа аргументов символ запятой без последующего многоточия в конце списка типов аргументов или списка параметров. Так же может быть использована отдельная запятая вместо многоточия для объявления и определения функций, требующих нуль или более аргументов. Использование запятой поддерживается только для совместимости. Желательно использовать в новой версии многоточие.

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

Рекурсивные вызовы

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

Заметим, что переменные, объявленные как глобальные, не требуют новой памяти при каждом рекурсивном вызове. Их память сохраняется на все время жизни программы.

97

Язык программирования С++

Язык программирования С++

Введение

Автором языка C++ является Бъерн Страуструп, сотрудник известной фирмы AT&T. C++ (а точнее, его предшественник, Си with classes) был создан под влиянием Simula (надо сказать, что этот язык программирования появился еще в 1967 году). Собственно, к тому моменту (когда появлялся C++), Си уже заработал себе популярность; обычно, его очень уважают за возможность использовать возможности конкретной архитектуры, при этом все еще используя язык относительно высокого уровня. Правда, обычно, именно за это его и не любят. Конечно же, при этом терялись (или извращались) некоторые положения построения программ; например, в Си фактически отсутствует возможность создавать модульные программы. Нет, их конечно же создают, но при помощи некоторых «костылей» в виде использования директив препроцессора — такой модульности, как, например в Modula 2 или Ada, в Си нет. Кстати сказать, этого нет до сих пор и в C++.

С самого начала подчеркивалось то, что C++ — развитие языка Си, возможно, некоторый его диалект. Об этом говорит тот факт, что первым компилятором (существующим до сих пор) являлся cfront, который занимался тем, что переводил исходный текст на C++ в исходный текст на Си. Это мнение бытует до сих пор и, надо сказать, до сих пор оно является небезосновательным; тем не менее, Си и C++ — разные языки программирования.

Основное отличие C++, когда он только появлялся, была явная поддержка объектно ориентированного подхода к программированию. Надо понимать, что программировать с использованием ООП и ООА можно где угодно, даже если инструментарий явно его не поддерживает; в качестве примера можно взять библиотеку пользовательского интерфейса GTK+, которая написана на «чистом» Си и использованием принципов объектно ориентированного «дизайна». Введение в язык программирования средств для поддержки ООП означает то, что на стадии компиляции (а не на стадии выполнения программы)

98

Язык программирования С++

будет производится проверка совместимости типов, наличия методов и т.п. В принципе, это достаточно удобно.

Опять же, точно так же как и Си не является в чистом виде языком программирования высокого уровня (из за того, что позволяет выполнить слишком много трюков), C++, строго говоря, не является объектно ориентированным языком программирования. Мешают этому такие его особенности, как наличие виртуальных функций (потому что при разговоре о полиморфизме никто никогда не оговаривает того, что некоторые методы будут участвовать в нем, а некоторые — нет), присутствие до сих пор функции main() и т.п. Кроме того, в C++ нет таких сущностей, как, например, метаклассы (хотя они, наверное, не так уж сильно и нужны) и интерфейсы (вместо них используется множественное наследование). Тем не менее, C++ на текущий момент один из самых популярных (если не самый популярный) язык программирования. Почему? Да потому что все эти «уродства» позволяют в итоге написать программу с использованием объектно ориентированных подходов (а программы, которые этого требуют, обычно очень большие) и при этом достаточно «быструю». Этому способствует именно наличие виртуальных функций (т.е., то, что программист сам разделяет еще во время проектирования, где ему понадобится полиморфизм, а где будет достаточно объединить некоторые функции в группу по некоторому признаку), обязательное наличие оптимизатора и прочее. Все это позволяет при грамотном использовании все таки написать работающую программу. Правда, достаточно часто встречаются примеры неграмотного использования, в результате чего выбор C++ для реализации проекта превращается в пытку для программистов и руководства.

На текущий момент на язык программирования C++ существует стандарт, в который включена, помимо прочего, стандартная библиотека шаблонов. О шаблонах разговор особый, формально они тоже являются «костылями» для того, чтобы сделать, так сказать, полиморфизм на стадии компиляции (и в этом качестве очень полезны), а вот библиотека — бесспорно правильное со всех сторон новшество. Наличие, наконец то, стандартных способов переносимо (имеется в виду, с компилятора на компилятор) отсортировать список (кроме написания всех соответствующих подпрограмм и структур данных

99

Язык программирования С++

самостоятельно) очень сильно облегчило жизнь программиста. Правда, до сих пор очень много людей плохо себе представляют как устроена STL и как ей пользоваться (кроме std::cin и std::cout).

Важной вехой в развитии программирования явилось создание и широкое распространение языка С++. Этот язык, сохранив средства ставшего общепризнанным стандартом для написания системных и прикладных программ языка Си (процедурно ориентированный язык), ввел в практику программирования возможности нового технологического подхода к разработке программного обеспечения, получившего название «объектно ориентированное программирование».

Язык программирования C++ — это C*, расширенный введением классов, inline функций, перегруженных операций, перегруженных имен функций, константных типов, ссылок, операций управления свободной памятью, проверки параметров функций.

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

Объектный подход информационного моделирования предметных областей все более успешно применяется в качестве основы для структуризации их информационных отражений и, в частности, баз знаний.

С++ является языком программирования общего назначения. Именно этот язык хорошо известен своей эффективностью, экономичностью, и переносимостью.

Указанные преимущества С++ обеспечивают хорошее качество разработки почти любого вида программного продукта.

Использование С++ в качестве инструментального языка позволяет получать быстрые и компактные программы. Во многих случаях программы, написанные на С++, сравнимы по скорости с программами, написанными на языке ассемблера.

100

Язык программирования С++

Перечислим некоторые существенные особенности языка С++:

С++ обеспечивает полный набор операторов структурного программирования;

С++ предлагает необычно большой набор операций;

Многие операции С++ соответствуют машинным командам и поэтому допускают прямую трансляцию в машинный код;

Разнообразие операций позволяет выбирать их различные наборы для минимизации результирующего кода;

С++ поддерживает указатели на переменные и функции;

Указатель на объект программы соответствует машинному адресу этого объекта;

Посредством разумного использования указателей можно создавать эффективно выполняемые программы, т.к. указатели позволяют ссылаться на объекты тем же самым путем, как это делает ЭВМ;

С++ поддерживает арифметику указателей, и тем самым позволяет осуществлять непосредственный доступ и манипуляции с адресами памяти.

Лексика

Есть шесть классов лексем: идентификаторы, ключевые слова, константы, строки, операторы и прочие разделители. Символы пробела, табуляции и новой строки, а также комментарии (собирательно — «белые места»), как описано ниже, игнорируются, за исключением тех случаев, когда они служат разделителями лексем.

Некое пустое место необходимо для разделения идентификаторов, ключевых слов и констант, которые в противном случае окажутся соприкасающимися.

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

101

Язык программирования С++

Комментарии

Символы /* задают начало комментария, заканчивающегося символами */. Комментарии не могут быть вложенными.

Символы // начинают комментарий, который заканчивается в конце строки, на которой они появились.

Идентификаторы (имена)

Идентификатор — последовательность букв и цифр произвольной длины; первый символ обязан быть буквой; подчерк '_' считается за букву; буквы в верхнем и нижнем регистрах являются различными.

Ключевые слова

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

asm

auto

break

case

char

class

const

continue

default

delete

do

double

else

enum

extern

float

for

friend

102

Язык программирования С++

goto

if

inline

int

long

new

operator

overload

public

register

return

short

sizeof

static

struct

switch

this

typedef

union

unsigned

virtual

void

while

Идентификаторы signed и volatile зарезервированы для применения в будущем.

Константы

Есть несколько видов констант. Ниже приводится краткая сводка аппаратных характеристик, которые влияют на их размеры.

103

Язык программирования С++

Целые константы

Целая константа, состоящая из последовательности цифр, считается восьмеричной, если она начинается с 0 (цифры ноль), и десятичной в противном случае. Цифры 8 и 9 не являются восьмеричными цифрами.

Последовательность цифр, которой предшествует или , воспринимается как шестнадцатеричное целое.

В шестнадцатеричные цифры входят буквы от а или А до f или F, имеющие значения от 10 до 15.

Десятичная константа, значение которой превышает наибольшее машинное целое со знаком, считается длинной (long); восьмеричная и шестнадцатеричная константа, значение которой превышает наибольшее машинное целое со знаком, считается long; в остальных случаях целые константы считаются int.

Явно заданные длинные константы

Десятичная, восьмеричная или шестнадцатеричная константа, за которой непосредственно стоит l (латинская буква «эль») или L, считается длинной константой.

Символьные константы

Символьная константа состоит из символа, заключенного в одиночные кавычки (апострофы), как, например, 'х'. Значением символьной константы является численное значение символа в машинном наборе символов (алфавите).

Символьные константы считаются данными типа int. Некоторые неграфические символы, одиночная кавычка ' и обратная косая \, могут быть представлены в соответствие со следующим списком escape последовательностей:

● символ новой строки NL(LF)

\n

● горизонтальная табуляция NT

\t

● вертикальная табуляция VT

\v

● возврат на шаг BS

\b

● возврат каретки CR

\r

● перевод формата FF

\f

● обратная косая \

\\

● одиночная кавычка (апостроф) '

\'

104

 

Язык программирования С++

 

 

● набор битов 0ddd

\ddd

● набор битов 0xddd

\xddd

Escape последовательность \ddd состоит из обратной косой, за которой следуют 1, 2 или 3 восьмеричных цифры, задающие значение требуемого символа. Специальным случаем такой конструкции является \0 (не следует ни одной цифры), задающая пустой символ NULL.

Escape последовательность \xddd состоит из обратной косой, за которой следуют 1, 2 или 3 шестнадцатеричных цифры, задающие значение требуемого символа. Если следующий за обратной косой символ не является одним из перечисленных, то обратная косая игнорируется.

Константы с плавающей точкой

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

Целая часть или мантисса (но не обе сразу) может быть опущена; или десятичная точка, или е (Е) вместе с целым показателем степени (но не обе части одновременно) может быть опущена. Константа с плавающей точкой имеет тип double.

Перечислимые константы

Имена, описанные как перечислители, являются константами типа int.

Описанные константы

Объект любого типа может быть определен как имеющий постоянное значение во всей области видимости его имени. В случае указателей для достижения этого используется декларатор *const; для объектов, не являющихся указателями, используется описатель const.

Строки

Строка есть последовательность символов, заключенная в двойные кавычки: «...». Строка имеет тип массив символов и класс памяти static, она инициализируется заданными символами.

105

Язык программирования С++

Компилятор располагает в конце каждой строки нулевой (пустой) байт \0 с тем, чтобы сканирующая строку программа могла найти ее конец.

В строке перед символом двойной кавычки " обязательно должен стоять \; кроме того, могут использоваться те же escape последовательности, что были описаны для символьных констант.

И, наконец, символ новой строки может появляться только сразу после \; тогда оба, — \ и символ новой строки, — игнорируются.

Синтаксис

Запись синтаксиса

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

Альтернативные категории записываются на разных строках. Необязательный терминальный или нетерминальный символ обозначается нижним индексом «opt», так что {выражение opt} указывает на необязательность выражения в фигурных скобках.

Имена и типы

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

Объект — это область памяти. Объект имеет класс памяти, определяющий его время жизни. Смысл значения, обнаруженного в объекте, определяется типом имени, использованного для доступа к нему.

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

Есть четыре вида областей видимости: локальная, файл, программа и класс.

106

Соседние файлы в предмете Программирование на C++