Программирование >>  Структурное программирование 

1 ... 67 68 69 [ 70 ] 71 72 73 ... 342


Замечание по технике программирования 3.12

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

Хороший стиль программирования 3.11

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

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

static int count = 1;

Все числовые переменные статического класса памяти принимают нулевые начальные значения, если программист явно не указал другие начальные значения. (Статические переменные - указатели, обсуждаемые в главе 5, тоже имеют нулевые начальные значения).

Спецификации класса памяти extern и static имеют специальное значение, когда они применяются явно к внешним идентификаторам. В главе 18, Другие темы , мы обсудим явное использование extern и static с внешними идентификаторами и программами с множеством исходных файлов.

3.11. Правила, определяющие область действия

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

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

Метки (идентификаторы с последующим двоеточием, например, start:) - единственные идентификаторы, имеющие областью действия функцию. Метки можно использовать всюду в функции, в которой они появились, но на них нельзя ссылаться вне тела функции. Метки используются в структурах switch (как метки case) и в операторах goto (смотри главу 18 Другие темы ). Метки - относятся к тем деталям реализации, которые функции прячут друг от друга. Это скрытие - более формально называемое скрытие (утаи-



вание) информации - один из наиболее фундаментальных принципов разработки хорошего программного обеспечения.

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

Единственными идентификаторами с областью действия прототип функции являются те, которые используются в списке параметров прототипа функции. Как ясно из предыдущего, прототипы функций не требуют имен в списке параметров - требуются только типы. Если в списке параметров прототипа функции используется имя, компилятор это имя игнорирует. Идентификаторы, используемые в прототипе функции, можно повторно использовать где угодно в программе, не опасаясь двусмысленности.

Типичная ошибка программирования 3.16

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

Хороший стиль программирования 3.12

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

Программа на рис. 3.12 демонстрирует области действия глобальных переменных, автоматических локальных переменных, и локальных переменных типа static.

Объявленной глобальной переменной х присвоено начальное значение 1. Эта глобальная переменная невидима в любом блоке (функции), в котором объявляется переменная с именем х. В main объявляется локальная переменная X, которой присваивается начальное значение 5. Переменная печатается, чтобы показать, что в main невидима глобальная х. Далее, в main определяется новый блок, с другой локальной переменной х, которой присваивается начальное значение 7. Эта переменная печатается, чтобы показать, чтобы показать, что она делает невидимой х внешнего блока main. Переменная X со значением 7 автоматически разрушается при выходе из блока, после чего печатается локальная переменная х внешнего блока функции main, чтобы показать, что она теперь не скрыта. Программа определяет три функции - каждая из них не требует аргументов и ничего не возвращает. Функция а определяет автоматическую переменную х и присваивает ей на-



чальное значение 25. При вызове а переменная печатается, получает приращение и печатается снова перед выходом из функции. Автоматическая переменная X создается заново и ей присваивается начальное значение 25 при каждом вызове этой функции. Функция b объявляет переменную х как static и присваивает ей начальное значение 50. Локальные переменные, объявленные как static, сохраняют свои значения, даже когда они находятся за пределами области действия. При вызове b переменная х печатается, получает приращение и печатается снова перед выходом из функции. При следующем вызове этой функции локальная переменная х типа static будет содержать значение 51. Функция с не объявляет никаких переменных. Поэтому, когда она ссылается на переменную х, то использует глобальную переменную х. При вызове с глобальная переменная х печатается, умножается на 10 и печатается снова перед выходом из функции. При следующем вызове этой функции глобальная переменная х будет содержать это модифицированное значение 10. Окончательно, программа снова печатает локальную переменную X в main, чтобы показать, что ни одна из функций не вызывает изменения значения х, так как все функции ссылаются на переменные в другой области действия.

Пример областей действия iinclude <iostream.h>

void а(void); void b(void); void с (void);

прототип функции прототип функции прототип функции

int X

глобальная переменная

main ( ) {

int X = 5;

локальная переменная main

cout локальная х во внешней области действия main =

X endl; { начало новой области действия

int X = 7;

cout << локальная х во внутренней области действия main = << X endl; } конец новой области действия

cout << локальная х во внешней области действия main = X << endl;

а О; а имеет автоматическую локальную переменную х

Ь(); II Ъ имеет статическую локальную переменную х

с(); с использует глобальную переменную х

а(); а заново дает начальное значение х

Ь(); статическая локальная х сохраняет предыдущее

значение

с(); глобальная х также сохраняет свое значение

cout << return О;

локальная х в main = х endl;



1 ... 67 68 69 [ 70 ] 71 72 73 ... 342

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика