Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Непейвода Н.Н. -> "Основания программирования " -> 135

Основания программирования - Непейвода Н.Н.

Непейвода Н.Н., Скопин И.Н. Основания программирования — Институт компьютерных исследований , 2002. — 919 c.
Скачать (прямая ссылка): osnovanprogramm2002.pdf
Предыдущая << 1 .. 129 130 131 132 133 134 < 135 > 136 137 138 139 140 141 .. 316 >> Следующая

Для языка C/С++, где вложенных процедур нет, все представляется довольно просто, и следующая схема программы иллюстрирует введенные понятия.
Программа 8.3.1
#include <stdio.h> const N = 100,
// Контексты программы:
// локальный: const N 100; N1 30;
// переменные a, b, c, x, y, z, u, v;
// процедуры P1, P2; // глобальный: то, что предоставляет <stdio.h>
void mainO {
const N1 = 50;
int x, y, u, v;
// Контексты функции main: // локальный: const N1 50;
int
void
void
N1 = 30;
a, b, c, x, y, z, u, v;
P1();
P2();
// переменные x, y, u, v;
384
ГЛАВА 8. ПОДПРОГРАММЫ
// глобальный: const N 100;
// переменные a, b, c, z;
// процедуры P1, P2;
// то, что предоставляет <stdio.h> // Внение данне main: она ничего не принимает и не вдает } // конец main
void P1() {
const N1 = 40;
int x, z, v;
// Контексты функции P1: // локальный: const N1 40;
// переменные x, z, v; // глобальный: const N 100;
// переменные a, b, c, y, u; // процедуры P1, P2; // то, что предоставляет <stdio.h> x = N1; // локальной переменной x присваивается значение
// N1 = 40 — локальной константы y = x + N; // переменной y, глобальной для P1 и локальной для // main, присваивается значение суммы переменной // x, локальной для P1 и N = 100 — глобальной (из // программы) константы a = b + x + y; // глобальной переменной a присваивается
// сумма глобальных переменных b (из программы) // и y (из P1 ) и локальной переменной x // Внение данне P1 :
// переменные y, a, b; константа N } // конец P1
void P2() {
// Контексты функции P1 : // локальный: (пустой) // глобальный: const N 100; N1 30;
// переменные a, b, c, x, y, z, u, v;
// процедуры P1, P2;
// то, что предоставляет <stdio.h>
x = N1;
8.3.
385
y = x + N; a = b + x + y;
P1(); // вызов процедуры P1 , глобальной для P2 // Внешние данные P2:
// переменные x, y, a, b; константы N1, N;
} // конец P2
Схема контекстов программы для языка, который допускает общий случай: вло енне описания процедур — представляется чуть сло нее. роилл -стрируем ее на примере языка Pascal.
Программа 8.3.2
program PROG;
const N = 100;
N1 = 30;
var a, b, c : { Для иллюстрации контекстов }
x, y, z : ...; { типы переменных } u, v : . . . ; { несущественны.} procedure P1 . . . ; const N1 = 50; var x, y : . . . ;
u, v : . . . ; procedure Pp1 ...; const N1 = 40; var x, z : . . . ;
v : . . . ;
{Контексты процедуры Pp1 : локальный: const N1 = 40;
var x, z, v; глобальный: const N1 = 50;
var y, u, v;
procedure Pp1;
const N = 100;
var a, b, c;
procedure P1;
}
begin {Pp1}
x := N1; { локальной переменной x присваивается значение
386
8.
локальной константы N1 = 40 } y := x + N; { переменной y, глобальной для Pp1 и локальной
для P1 , присваивается значение суммы переменной x, локальной для Pp1 ,
и глобальной (из основной программы) константы N = 100 } a := b + x + y; { глобальной переменной a присваивается значение суммы глобальных переменных b (из программы) и y (из P1 ) и локальной переменной x } { нение данне процедуры Pp1 :
переменные y, a, b; константа N }
end; {Pp1} procedure Pp2 ...;
{Контексты процедур Pp2: локальнй: (пустой)
глобальный:
const N1 = 50; var x, y, u, v; procedure Pp2, Pp1; const N = 100; var a, b, c, z; procedure P1; }
begin {Pp2}
x := N1; { переменной x, глобальной для Pp2 и локальной
для P1 присваивается значение константы N1 = 50 из процедуры P1 (глобальной для Pp2) }
y := x + N; { переменной y из P1 присваивается значение сумм переменной x из P1 и глобальной константы N = 100 (из основной программы) }
a := b + x + y; { глобальной переменной a присваивается значение суммы глобальной переменной b (из основной программы) и локальных для P1 переменных x и y }
Pp1; { вызов процедуры Pp1 , глобальной для Pp2, но
локальной для P1 } { нение данне процедуры Pp2:
переменные x, y, a, b;
8.3.
387
константы N1, N; }
end; {Pp2}
{ Контексты процедуры P1
локальный: const N1 = 50;
var x, y, u, v; глобальный: const N = 100;
var a,b,c, x,y;
procedure Pp2,Pp1,P1;}
begin {P1} end; {P1}
procedure P2 . . . ;
{Контексты процедуры P2 локальный: (пустой) глобальный:
const N = 100; N1= 30; var a,b,c, x,y,z, u,v; procedure P2; P1; }
begin {P2}
end; {P2}
{ Контексты программы PROG локальный:
const N = 100; N1 = 30; var a,b,c, x,y,z, u,v; procedure P2, P1;
глобальный: (пустой)}
begin {PROG}
end. {PROG}
Из приведенных схем видно, как глобальные имена экранируются локальными описаниями и, тем самым, становятся недоступными во вложенных блоках.
Все сказанное выше про локализацию имен при практическом применении необходимо согласовывать с возмо ностями используемой систем программирования. рименительно к языку С/С++ ну но иметь в виду на-
388
ГЛАВА 8. ПОДПРОГРАММЫ
личие препроцессора, который в принципе 'не знает' языка, но, тем не менее, оперирует с именами программного текста. Среди прочего действия препроцессора включают в себя подстановку определенным образом оформленных фрагментов вместо их имен, которые определяются операторами #define. В результате в программном тексте появля тся как нормальне, относяие-ся к языку имена, так и имена обозначений текстовых фрагментов. Так вот, если первые подчиняются только что определенным правилам локализации, то вторые — нет. Они подчиняются правилам, которые "знает" препроцессор: если имя определено оператором #define как обозначение некоторого фрагмента, то это обозначение действует, сразу же после данного оператора и до конца текста либо до нового оператора #define, переопределяющего данное имя. Слово 'действует' надо понимать следующим образом: препроцессор подставляет обозначенный именем фрагмент в то место текста, в котором встречается данное имя. Нужно осознавать, что при вставке фрагмента встречающиеся в нем имена приобретают смысл из контекста вставки (но не описания, как если бы действовали правила (a)-(e)). Таким образом, работа препроцессора может создать впечатление нарушения правил локализации имен.6
Предыдущая << 1 .. 129 130 131 132 133 134 < 135 > 136 137 138 139 140 141 .. 316 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100