Теория: Термины и концепции


4. Имена

Имя в МS-Фортране или идентификатор содержат последовательность буквенноцифровых символов (максимум по 66 символов в строке, умноженных на 20 строк). Начальный символ должен быть буквенным, следующие символы должны быть буквенноцифровыми. Пробелы игнорируются. Только первые шесть буквенноцифровых символов являются значащими, остальные игнорируются.

Имя означают определенную пользователем или системой переменную, массив или программную единицу. Любая значащая последовательность символов может быть использована для любого имени Фортрана. Здесь нет зарезервированных имен, как в других языках. Последовательности буквенных символов, используемые как ключевые слова компилятора МS-Фортрана не смешиваются с именами, определяемыми пользователем. Компилятор отличает ключевые слова по их контексту и на использование имен, определяемых пользователем, нет ограничений.

Поэтому в программе могут быть массивы с именами, например, IF, READ или GO TO и при этом не будет ошибок (пока они будут использоваться по правилам, которым должны подчиняться). Однако, использование ключевых слов для имен пользователя часто мешает читабельности программы и, практически, этого следует избегать.

4.1. Область действия имен Фортрана

Область действия имени - Это диапазон операторов, где это имя известно, или на него можно ссылаться в программе на Фортране.

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

Имя с глобальной областью действия может быть использовано в более чем одной программной единице (подпрограмме, функции, основной программе) и на него можно ссылаться в них. Фактически, имена с глобальной областью действия используются обычным последовательным образом в одной и той же программе. Все имена процедур, функций, подпрограмм, COMMON-блоков так же как и имена программ имеют глобальную область действия. Поэтому не может быть подпрограммы-функции с тем же именем, что и подпрограмма или COMMON-блок. Также в одной программе две процедуры-функции не могут иметь однои то же имя.

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

Единственным исключением в правилах областей действия является имя, присваиваемое данным в COMMON-блоке. Можно ссылаться на глобально действующее имя COMMON-блока в программной единице, в которой определено такое же локально действующее имя. Это возможно благодаря тому, что имя COMMON-блока всегда заключено в косые черточки, например, /FROG/ и поэтому всегда отличимо от таких же, но обычных имен.

Другое исключение из правил областей действия сделано для параметров функции-оператора. Область действия параметров функции-оператора ограничена единственным оператором, входящим в эту функцию. Любое другое использование этих имен в функции-операторе недопустимо, пока они могут быть задействованы и вне ее.

4.2. Имена Фортрана по умолчанию

При проходе по выполняемым операторам программа компилятор заводит имена, встречающиеся ему впервые ( т.е. те, которые не определены точно ), в соответствии с контекстом.

Если имя используется как переменная, его тип определяется по первой букве имени ; I, J, K, L, M или N по умолчанию принимаются целыми, а остальные буквы - действительными числами. Вы можете использовать оператор IMPLICIT для замены соответствия типа и начальной буквы (подробнее, смотрите часть 3 "Операторы"). Это же правило используется при использовании имени в функции для определения типа возвратной величины.

Когда имя используется как указатель в операторе CALL, подразумевается что это имя подрограммы. Точно так же подразумевается, что имя, используемое в ссылке на функцию, - это имя функции. Если подпрограмма или функция является частью этой же компилируемой единицы ( т.е. находятся в этом же текстовом файле ) и это определение приведено до оператора CALL или ссылки на функцию, то компилятор проверит, чтобы тип фактических параметров и их число в операторе CALLили ссылке на функцию соответствовали определениям в операторе SUBROUTINE или FUNCTION.

5. Выражения.

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

В Фортране существует четыре класса выражений :

1. Арифметические.
2. Символьные.
3. Отношения.
4. Логические.

5.1. Арифметические выражения.

Результатом арифметических выражений являются величины типов INTEGER, REAL, DOUBLE PRECISION или COMPLEX. Простейшие виды арифметических выражений - это :
1. Константы.
2. Использование переменных.
3. Использование элементов массивов.
4. Использование функций.

Используемые величины переменных или элементов массивов должны быть определены до того, как они появятся в арифметическом выражении. Также, величины целых переменных должны быть арифметическими, а не величинами меток операторов, установленными оператором ASSIGN.

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

---------------------T----------------------T------------¬
| Оператор           |     Операция         |  Приоритет |
+--------------------+----------------------+------------+
|     * *            | Возведение в степень |  Высший    |
|      /             | Деление              |  Средний   |
|      *             | Умножение            |  Средний   |
|      -             | Вычитание или отриц. |  Низший    |
|      +             | Сложение или         |  Низший    |
|                    |          идентичность|            |
L--------------------+----------------------+-------------
     Таблица 2-3. Арифметические операторы.

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

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

     A/B * C                (A/B) * C
     A * * B * * C          A * * (B * * C)

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

     A * * - B

но можно

     A * * (- B)

Унарный минус имеет наименьший приоритет. Поэтому выражение -А**В понимается как - (А ** В).

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

5.2. Деление целых

Результатом деления двух целых чисел является величина, равная математическому частному двух этих величин, округленного до целого в сторону нуля. Поэтому 7/3 превращается в 2, а (-7)/3 превращается в -2. Как 9/10, так и 9/(-10) равны нулю.

5.3. Преобразования типов арифметических операндов

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

Ранг операнда зависит от его типа данных соответственно следующему списку :

1. INTEGER * 2 (низший ранг)
2. INTEGER * 4
3. REAL * 4
4. REAL * 8
5. COMPLEX * 8
6. COMPLEX * 16 (высший ранг)

Например, результатом операции над элементами INTEGER*2 и REAL*4 будет величина, относящаяся к типу данных REAL*4.

Специальный случай : операция над операндами типов REAL*8 и COMPLEX*8 породит COMPLEX*16, а не COMPLEX*8.

Тип данных всего выражения - это тип данных результата последней операции, выполненной при вычислении всего выражения.

Типы данных операций могут быть INTEGER*2, INTEGER*4, REAL*4, REAL*8, COMPLEX*8 или COMPLEX*16.

Целые операции выполняются только над целыми операндами. Дробный результат от деления в целой арифметике превращается в целое, а не округляется. Поэтому следующие выражение равно нулю, а не единице :

     1/4 + 1/4 + 1/4 + 1/4

Распределение памяти для типа INTEGER без указания длины *2 или *4 в определении типа зависит от использования метакоманды $STORAGE (для подробностей смотрите раньше в этой части и части 6 "Метакоманды МS-Фортрана").

Действительные операции выполняются только над действительными операндами или комбинацией действительного и целого операндов. Целые операнды сначала преобразуются в действительные прибавлением к каждому дробной части равной нулю. Затем для вычисления выражения используется действительная арифметика. Но в следующем операторе сначала осуществляется целое деление I на J, а потом действительное умножение результата на X :

     Y = (I/J) * X

5.4. Символьные выражения

Результатом символьных выражений является тип CHARACTER. Формы символьных выражений следующие :

1. Символьные константы.
2. Ссылки на символьные переменные.
3. Ссылки на элементы символьных массивов.
4. Любые символьные выражения, заключенные в скобки.
5. Ссылки на символьные функции.
В символьных выражениях нет операторов.

5.5. Выражения отношения

Выражения отношения сравнивают величины двух арифметических или двух символьных выражений. Арифметическое выражение нельзя сравнивать с символьным, пока не определена метакоманда $NOTSTRICT. В этом случае арифметические выражения сравнимы с символьными. Результатом выражения отношения является тип LOGICAL. Для сравнения величин в выражениях отношения можно использовать любой оператор, указанный в таблице 2-4.

----------------------------T----------------------------¬
|        Оператор           |             Операция       |
+---------------------------+----------------------------+
|        .LT.               |   Меньше чем               |
|        .LE.               |   Меньше или равно         |
|        .EQ.               |   Равно                    |
|        .NE.               |   Не равно                 |
|        .GT.               |   Больше чем               |
|        .GE.               |   Больше или равно         |
L---------------------------+-----------------------------
     Таблица 2-4. Операторы отношения.

Все операторы отношения бинарные и появляются между двумя операндами. Среди операторов отношения нет относительного старшинства или сочетательности и поэтому выражение следующего вида нарушает правила типов для операндов :

     A .LT. B .NE. C

Выражения отношения могут появляться только в логических выражениях.

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

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

5.6. Логические выражения

Результатом логического выражения является величина типа LOGICAL. Простейшие формы логических выражений следующие :

1. Логические константы.
2. Ссылки на логические переменные.
3. Ссылки на элементы логических массивов.
4. Ссылки на логические функции.
5. Выражения отношения.

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

------------T-----------------------------T--------------¬
|  Оператор |           Операция          |     Приоритет|
+-----------+-----------------------------+--------------+
|  .NOT.    |  Отрицание                  |  Наивысший   |
|  .AND.    |  Конъюнкция                 |  Средний     |
|  .OR.     |  Включающая дизъюнкция      |  Средний     |
|  .EQV.    |  Эквивалентность            |  Низший      |
|  .NEQV.   |  Неэквивалентность          |  Низший      |
L-----------+-----------------------------+---------------
     Таблица 2-5. Логические операторы.

Операторы .AND., .OR., .EQV., .NEQV. не являются бинарными и появляются между двумя операндами логических выражений. Оператор .NOT. - унарный и предшествует своему операнду.

Операции равного приоритета выполняются слева направо, поэтому, например,

     A .AND. B .AND. C

Эквивалентно :

     (A .AND. B) .AND. C

Пример правила приоритета :

     .NOT. A .OR. B .AND. C

выполняется как :

     (.NOT. A) .OR. (B .AND. C)

Два .NOT. не могут соседствовать с друг другом, хотя

     A .AND. .NOT. B

- это пример допустимого выражения с двумя операторами подряд.

Другой пример правила приоритетов и использования .EQV. и .NEQV. :

     .NOT. A . EQV. B .OR. C .NEQV. D .AND. E

может быть выполнено как

     ((.NOT. A) .EQV. (B .OR. C)) .NEQV. (D .AND. E)

Логические операторы имеют тоже самое значение, что и в стандартной математической семантике с неразделительным .OR.. Например:

     .TRVE. .OR. .TRVE.

даст величину

     .TRVE.

5.7. Приоритеты операторов

Когда в одном выражении встречаются арифметические, логические операторы и операторы отношения, они выполняются со следующими приоритетами :

1. Логические (низший).
2. Отношения (средний).
3. Арифметические (высший).

<<<Назад  Теория

Rambler's Top100

Copyright © fortran-online.info, 2007