Добавил:
Лабы/курсовые по программированию (С++/Verilog HDL), Теория и Практика Помехоустойчивого Кодирования Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
1сем Дагаев / lectures_3.pdf
Скачиваний:
44
Добавлен:
09.03.2022
Размер:
769.01 Кб
Скачать

int k = n; // Инв.

while(k != 0)

{

p *= a;

k--; // Инв.

}

Третий вариант решения.

// Инвариант p * b == a n p = 1.0;

int k = n; double b = a; while(k != 0)

{

if(k % 2 == 1)

{

p *= b; k--;

}else

{

b *= b; k /= 2;

}

}

35. Объявления и определения (расширенное рассмотрение)

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

В общем случае объявление программного элемента состоит из двух структурных частей:

последовательности спецификаторов.

списка описателей; элементы списка отделяются запятыми Вначале объявления должна записываться последовательность

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

35.1.Спецификаторы объявления

Можно выделить следующие три категории спецификаторов:

70

спецификаторы класса памяти.

квалификаторы типа.

спецификаторы типа.

Спецификаторы класса памяти.

Имеются следующие спецификаторы класса памяти:

auto.

extern

regester

static

typedef

Класс памяти определяет время существования и вид связывания объявляемого имени. Ниже в таблице приводится назначение спецификаторов класса памяти приведено.

Спецификатор

Назначение

auto

Спецификатор допустим только в блоках и предназначен для

 

указания на то, что переменная является локальной

 

(автоматической). В программах обычно не используется в связи с

 

тем, что по умолчанию локальные переменные имеют класс памяти

 

auto.

extern

Этот спецификатор используется для указания на то, что

 

определяемое имя имеет внешнее связывание.

register

Спецификатор применяется при работе с локальными переменными

 

с той целью, чтобы рекомендовать компилятору хранить эту

 

переменную в регистре. Современные компиляторы часто

 

игнорируют эту спецификацию в связи с тем, что могут справиться

 

с оптимизацией использования регистров лучше программиста.

static

Этот спецификатор может появляться в объявлениях функций и

 

переменных. В объявлениях функций этот спецификатор указывает

 

на внутренное связывание. В объявлениях переменных назначение

 

спецификатора зависит от контекста, в котором встречается

 

объявление. В том случае, когда объявление находится вне

 

функций, то спецификатор указывает на внутреннее связывание.

 

Для локальных переменных определяет размещение переменной в

 

статической области оперативной памяти.

typedef

Определяет не имя функции или переменной, а имя типа. Имя типа

 

располагается на месте объявителя.

Квалификаторы типа

Классификаторы const и volatile были введены в язык Си стандартом C89. Классификатор restrict был добавлен в язык стандартом С99.

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

Квалификатор volatile предполагает, что значение объекта может внезапно измениться. На практике переменная, привязанная к некоторому аппаратному регистру, должна быть объявлена с использование этого

71

Соседние файлы в папке 1сем Дагаев