Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Переменные с одинаковыми именами






 

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

 

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

 

Рассмотрим программу, где существует глобальная переменная Ch и локальная Ch, значения которых существуют одновременно, хотя в любой момент времени доступна только одна.

 

PROGRAM CopyR(INPUT, OUTPUT);

{Копирует в OUTPUT первые два символа из INPUT в обратном порядке}

PROCEDURE CopyChar(VAR F1, F2: TEXT);

{Копирует в F2 следующий символ их F1}

VAR

Ch: CHAR;

BEGIN {CopyChar}

IF NOT EOF(F1)

THEN

BEGIN

READ(F1, Ch);

WRITE(F2, Ch)

END

END; { CopyChar}

BEGIN {CopyR}

READ(Ch);

CopyChar(INPUT, OUTPUT);

WRITELN(Ch)

END. {CopyR}

 

Оператор READ CopyR использует глобальную Ch, а во время выполнения процедурного оператора

CopyChar(INPUT, OUTPUT)

Локальная Ch (объявленная в CopyChar) перекрывает глобальную и используется операторами READ, WRITE внутри процедуры.

READ(F1, Ch);

WRITE(F2, Ch)

Во время когда локальная Ch перекрывает глобальную, значение глобальной не теряется, к ней невозможен доступ, но ее значение сохраняется Паскаль-машиной. Далее, когда выполнение CopyChar завершается локальная Ch пропадает и глобальная снова становится доступной. Таким образом, финальный оператор

WRITE(OUTPUT, Ch)

Ссылается на глобальную переменную.

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

  INPUT OUTPUT global Ch Local Ch
  PROGRAM CopyR(INPUT, OUTPUT); VAR Ch: CHAR; BEGIN {CopyR} READ(Ch); CopyChar(INPUT, OUTPUT) VAR Ch: CHAR; BEGIN {CopyChar} READ(INPUT, Ch); WRITE(OUTPUT, Ch) END WRITELN(Ch) END. {CopyR} ABC A BC/     A B C/   AB C /   ABC   _   B_   BA/_ BA   § ? A _____   _____   §     ?   B     §

 

Таким образом, при выполнении A считывается первой, а записывается последней, после того как B считывается и записывается CopyChar.

 






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.