|
Программирование >> Структурное программирование
Значения этих констант перечисления начинаются с О, если не указано иное, и увеличиваются с приращением, равным 1. Идентификаторы в enum должны быть уникальными, но отдельные константы перечисления могут иметь одинаковые целые значения. Любой константе перечисления может быть присвоено целое значение в определении перечисления. Каждый идентификатор переменной характеризуется классом памяти, областью действия и компоновкой. С++ обеспечивает четыре спецификации класса памяти: auto, register, extern и static. Класс памяти идентификатора определяет время жизни этого идентификатора в памяти. Область действия идентификатора определяет, где в программе можно ссылаться на этот идентификатор. Компоновка идентификатора определяет для программы с многими исходных файлов, известен ли идентификатор только в текущем исходном файле или в любом исходном файле с соответствующим объявлением. Переменные автоматического класса памяти создаются при вхождении в блок, в котором они объявлены, существуют лишь пока этот блок активен и уничтожаются при выходе из блока. Спецификатор класса памяти register может быть помещен перед объявлением автоматической переменной, чтобы указать компилятору разместить переменную в одном из высокоскоростных аппаратных регистров компьютера. Компьютер может проигнорировать объявление register. Ключевое слово register можно использовать только для переменных автоматического класса памяти. Ключевые слова extern и static используются, чтобы объявить идентификаторы переменных и функций статического класса памяти. Переменные статического класса памяти размещаются и получают начальные значения в начале выполнения программы. Статический класс памяти имеют два типа идентификаторов: внешние идентификаторы и локальные переменные, объявленные спецификацией класса памяти static. Глобальные переменные создаются путем помещения их объявления вне какого-либо описания функции и они сохраняют свои значения в течение всего времени выполнения программы. Локальные переменные, объявленные как static, сохраняют свои значения после выхода из функции, в которой они объявлены. Все численные переменные статического класса памяти получают нулевые начальные значения, если программист не присвоил им явно другие начальные значения. Существуют четыре области действия идентификаторов: область действия функция, область действия файл, область действия блок и область действия прототип функции. Метки являются единственными идентификаторами с областью действия функция. Метки можно использовать всюду внутри функции, в которой они находятся, но на них нельзя ссылаться вне тела функции. Идентификатор, объявленный вне любой функции, имеет областью действия файл. Такой идентификатор известен с момента его объявления до конца файла. Идентификаторы, объявленные внутри блока, имеют областью действия блок. Область действия блок заканчивается завершающей правой фигурной скобкой (}). Локальные переменные, объявленные в начале функции, имеют областью действия блок подобно параметрам функции, которые считаются локальными переменными функции. Любой блок может содержать объявления переменных. Если блоки вложены и идентификатор во внешнем блоки имеет такое же имя, как идентификатор во внутреннем блоке, идентификатор во внешнем блоки невидим (скрыт) до тех пор, пока не завершится внутренний блок. Единственными идентификаторами, имеющими областью действия прототип функции, являются те, которые использованы в списке параметров прототипа функции. Идентификаторы, использованные в прототипе функции, можно повторно использовать в других местах программы без опасений возникновения неопределенности. Рекурсивная функция - это функция, которая прямо или косвенно вызывает сама себя. Если рекурсивная функция вызывается базовой задачей, она просто возвращает результат. Если функция вызывается более сложной задачей, функция разделяет задачу на две части: часть, которую функция умеет выполнять, и несколько упрощенный вариант исходной задачи. Поскольку этот вариант подобен исходной задаче, функция путем рекурсивного вызова начинает работать над такой упрощенной задачей. Чтобы завершить процесс рекурсии, каждый раз, как функции вызывает саму себя с несколько упрощенной версией исходной задачи, должна формироваться последовательность все меньших и меньших задач, в конце концов сходящаяся к базовой задаче. В этот момент функция распознает базовую задачу, возвращает результат предыдущей копии функции и последовательность возвратов повторяет весь путь назад, пока не дойдет до первоначального вызова и не возвратит конечный результат. Стандарт ANSI не регламентирует порядок, в котором вычисляются операнды большинства операций. С-Н- определяет порядок вычисления операндов только в операциях &&, , последования (,) и ?:. Для первых трех бинарных операций операнды гарантированно вычисляются слева направо. Последняя операция - единственная тернарная операция в С-1-f-. Ее самый левый операнд всегда выполняется первым; если результат его вычисления отличен от нуля, то следующим вычисляется средний операнд, а последний операнд игнорируется; если же результат вычисления самого левого операнда равен нулю, то следующим вычисляется третий операнд, а средний операнд игнорируется. Как итерации, так и рекурсии основаны на управляющих структурах: итерации используют структуру повторения, рекурсии используют структуру выбора. Как итерации, так и рекурсии включают повторение: итерации используют структуру повторения явным образом, рекурсии реализуют повторение посредством повторных вызовов функции. Как итерации, так и рекурсии включают проверку условия окончания: итерации заканчиваются после нарушения условия продолжения цикла, рекурсии заканчиваются после распознавания базовой задачи. Как итерации, так и рекурсии могут оказаться бесконечными: бесконечный итеративный цикл возникает, если условие продолжения цикла никогда не становится ложным; бесконечная рекурсия возникает, есди шаг рекурсии не упрощает исходную задачу таким образом, чтобы она сходилась к базовой. Повторный запуск рекурсивного механизма вызовов функции приводит к росту накладных расходов: к нарастающим затратам процессорного времени и требуемого объема памяти. Программа на С++ не компилируется, если какая-то функция не имеет прототипа и не описана перед ее использованием. Функция, не возвращающая значение, объявляется с типом void. Если предпринять попытку вернуть значение функции или использовать результат активизации функции в вызывающем выражении, компилятор сообщит об ошибке. Пустой список параметров указывается пустыми круглыми скобками или ключевым словом void в круглых скобках. Встраиваемые функции исключают накладные расходы, связанные с вызовом функции. Программист может использовать ключевое слово inline, чтобы посоветовать компилятору сгенерировать машинные коды функции в нужных местах программы (если это возможно), чтобы минимизировать вызовы функции. Компилятор может проигнорировать inline. С++ предусматривает возможность прямой формы вызова по ссылке с помощью ссылочных параметров. Чтобы указать, что параметр функции передается по ссылке, после типа параметра в прототипе функции пишется символ &. В вызове функции переменная указывается по имени, но она будет передана по ссылке. В вызываемой функции обозначение переменной ее локальным именем на самом деле отсылает к исходной переменной в вызывающей функции. Таким образом, исходная переменная может быть изменена с помощью вызываемой функции. Ссылочные параметры могут быть также созданы для локального применения как псевдонимы других переменных внутри функции. Ссылочные переменные должны получить начальные значения в своих объявлениях и они не могут быть переприсвоены как псевдонимы другим переменным. Как только ссылочная переменная объявлена как псевдоним другой переменной, все операции, предположительно выполняемые над псевдонимами, на самом деле выполняются над переменными. Спецификация const может создать именованную константу. Именованная константа должна получить в качестве начального значения
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |