Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции / LECS6.DOC
Скачиваний:
41
Добавлен:
16.04.2013
Размер:
56.83 Кб
Скачать

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

{

int a=2; // а – вне блока

cout<<a<<endl; // печать 2

{

int a=7;

cout<<a<<endl; //печать 7

}

cout<<++a<<endl; //напечатается 3

}

В Си++ область видимости идентификатора начинается сразу после его объявления и продолжается до конца самого внутреннего блока, в котором он объявлен.

Рассмотрим пример 7.6 (стр.5)

// Не конфликтующие локальные переменные

#include <stdio.h>

#include <conio.h>

void Pause(void);

void Function1(void);

void Function2(void);

main()

{

Function1();

return 0;

}

void Pause(void)

{

printf("Press <SpaceBar> to continue...");

while (getch() != ' ') ;

}

void Function1(void);

{

char s[15] = "Philadelphia\n"

printf("\nBegin function #1. s = %s", s);

Pause();

Function2();

printf("\nBack in function #1. s = %s", s);

}

void Function2(void)

{

char s[15] = "San Francisco\n"

printf("Begin function #2. s = %s", s);

Pause();

}

Класс памяти auto

Переменные имеют два атрибута:

тип и класс памяти:

auto – автоматический

extern – внешний

register – регистровый

static – статический

volatile – непостоянный для Borland

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

{

auto int a, b, c;

auto float f=7.7;

}

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

Стек до блока Вошли в блок Вышли из блока Класс памяти register

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

Например,

{ for(register i=0; i<LIMIT; i++)

{…

}

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

Для явного указания того, чтобы переменная не была размещена в регистре используется слово volatile (для компилятора Borland)

Рассмотрим пример 7.7 стр(6)

/* Переменные классов registers и volatole */

#include <stdio.h>

void UseRegister(void);

void UseVolatile(void);

main()

{

UseRegister();

UseVolatile();

return 0;

}

void UseRegister(void)

{

register int k;

printf("\nCounting with a register variable\n");

for (k =1; k <= 100; k++)

printf("%8d", k);

}

void UseVolatile(void)

{

volatile int k;

printf("\nCounting with a volatile variable\n");

for (k = 1; k <= 100; k++)

printf("%8d", k);

}

Класс памяти extern.

Когда переменная объявлена вне функции, память для нее выделяется на постоянной основе (не в стеке), а класс памяти extern. Переменная, объявленная со словом extern, является глобальной. Компилятор ищет эту переменную во всех файлах, компилируемых в одну программу.

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

Пример.

Файл circle 3.cpp

const double pi=3.14; //локальна по отношению к circle 3.cpp

double circle (double radius)

{return (pi*radius*radius);

}

файл cir_main.cpp

#include <iostream.h>

double circle (double); //внешняя функция автома.

Int main ()

{

double x

. . . .

cout<<circle (x)<<”- площадь круга радиуса

<<x<<endl;

}

Рассмореть 7.8, 7.9

/* Внешние переменные - часть 1 */

#include <stdio.h>

void GetFloat(void);

float f;

main()

{

GetFloat();

printf("Value of float = %f\n", f);

return 0;

}

/* Внешние переменные - часть 2 */

#include <stdio.h>

void GetFloat(void)

{

extern float f;

printf("Enter floating point value: ");

scanf("%f", &f);

}

Класс памяти static

Статические переменные имеют два важных применения.

  1. Локальная статическая переменная сохраняет предыдущее значение при повторном входе в блок.

Пример.

Int f ()

{

static int called=0;

++called;

. . . .

return called;

}

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

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

static int goo (int a)

{

. . . .

}

int foo (int a)

{

. . . .

b=goo (a); //goo доступна только в этом файле

. . . .

}

(7.10) что делает эта программа.

/* Статические переменные */

#include <stdio.h>

int Next1(void);

int Next2(void);

main()

{

int i;

printf("\nCalling Next1():\n");

for (i = 1; i <= 10; i++)

printf(" %d", Next1());

printf("\nCalling Next2():\n");

for (i = 1; i <= 10; i++)

printf(" %d", Next2());

return 0;

}

int Next1(void)

{

static int value = 1; /* Static variable */

return value++;

}

int Next2(void)

{

int value = 1; /* Normal local variable */

return value++;

}

Соседние файлы в папке Лекции