[ предыдущая страница ] [ следующая страница ] [ содержание ]

5.3. Переменные и указатели на переменные

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

5.3.1. Переменные

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

Например, можно определить переменную с именем х и присвоить ей значение, например, 5. Тогда впоследствии вычисление выражения 10+х даст результат 15. В процессе выполнения сценария значения переменных можно изменять.

В языке ActionScript переменные не требуют объявления. Каждая переменная создается в момент первого обращения к ней. Список существующих переменных можно увидеть в режиме просмотра ролика, нажав сочетание клавиш CTRL+ALT+V.

Оператор присваивания

Чтобы присвоить переменной значение, нужно использовать оператор присваивания =. Например, запись

х = 5;

присвоит переменной х значение 5.

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

a = "who are you";

присвоит переменной a строковое значение "who are you".

Рассмотрим маленький пример. Вставим в первый кадр ролика такой код:

g = "lklkj";
k = 3;
u = "5+5";
r = 5+5;
q = "What"+" is this?";
sum = k+r;

Если теперь запустить просмотр ролика (CTRL+ENTER) и нажать клавиши CTRL+ALT+V, то мы увидим следующее:

Level #0:
   Variable _level0.$version = "WIN 5,0,30,0"
   Variable _level0.g = "lklkj"
   Variable _level0.k = 3
   Variable _level0.u = "5+5"
   Variable _level0.r = 10
   Variable _level0.q = "What is this?"
   Variable _level0.sum = 13

Как видите, поскольку все переменные созданы в основном ролике на уровне 0 (об уровнях мы рассказывали в предыдущем разделе), все они имеют префикс level0. Все переменные имеют те значения, которые мы им присвоили. Переменная r имеет значение 10, поскольку 5+5 является математическим выражением, которое было вычислено перед операцией присваивания. Переменная u имеет строковое значение "5+5" (обратите внимание, что при присваивании мы заключили его в кавычки).

Переменной sum мы присваивали значение k+r, то есть сумму значений переменных k и r. Поскольку в момент присваивания обе эти переменные уже существовали и имели значения, соответственно, 3 и 10, программа вычислила их сумму (13) и полученное значение присвоила переменной sum. Если бы в этот момент одна из переменных еще не существовала, то она была бы создана и ей было бы присвоено значение 0.

Обратите внимание на переменную q. При ее создании мы присвоили ей значение, состоящее из "суммы" двух строк. Дело в том, что знак + по отношению к строковым переменным означает конкатенацию ("склеивание" строк). Если же попытаться "сложить" число и строковое значение, число будет автоматически преобразовано в строку и после этого выполнена конкатенация. Например, если написать

k = "3";
r = 5+5;
sum = k+r;

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

Level #0:
   Variable _level0.$version = "WIN 5,0,30,0"
   Variable _level0.k = "3"
   Variable _level0.r = 10
   Variable _level0.sum = "310"

Как видите, в данном случае переменная k имеет не числовое значение 3, а строковое - "3". Следовательно, при попытке "сложить" переменные k и r числовое значение переменной r (10) преобразуется в строку, после чего строки "склеиваются" вместе.

Вы, наверное, уже обратили внимание, что в приведенных листингах переменных присутствует также переменная $version. Эта переменная является системной и содержит номер и тип версии Flash. Вообще говоря, этой переменной можно обычным образом присвоить любое значение. Однако этого делать не рекомендуется, поскольку результатом могут стать ошибки в работе программы. Кроме того, вообще не рекомендуется использовать имена переменных, начинающиеся с символов $ и _ (подчеркивание).

Язык ActionScript позволяет работать с довольно-таки большими числами. Возможные числовые значения переменных лежат в пределах от -1,7*10308 до 1,7*10308.

Тем, кто привык работать в обычном, а не в профессиональном режиме ввода кода сценария, для задания операции присваивания следует выбрать пункт set variable из папки Actions (Действия) в левой части окна ввода сценария. Для снятия кавычек (то есть для получения числового значения или выражения) установите флажок Expression (Выражение) справа от поля Value (Значение).

5.3.2. Указатели

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

Указателем на переменную называется область памяти, где хранится имя данной переменной. "Тонкость" состоит в том, что для присваивания значения к переменной можно обратиться по имени указателя. В некоторых случаях эта возможность просто незаменима. Для обращения к переменной по се указателю используется оператор set.

Приведем пример. Допустим, мы хотим присвоить значение 28 переменной х, а имя "х" у нас хранится в переменной pointer. Мы можем написать так:

pointer = "х";
set (pointer,28);

В этом случае оператор set присвоит значение 28 переменной, имя которой хранится в переменной pointer, то есть в данном случае - переменной х.

Level #0:
   Variable _level0.$version = "WIN 5,0,30,0"
   Variable _level0.pointer = "x"
   Variable _level0.x = 28

Кстати, этим способом можно создать переменную с любым, даже "запрещенным" именем. Например, если написать

pointer = "6";
set (pointer,28);

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

Чтобы ввести оператор set в обычном режиме, выберите пункт set variable, как и в предыдущем случае, но при этом установите флажок Expression (Выражение) справа от поля Variable (Переменная).

5.4. Выражения и операции

В отличие от строковых и числовых констант, явно задающих значение, в языке ActionScript могут использоваться выражения, значения которых для дальнейшего использования должны быть вычислены. Например, если написать в коде число 5 или строку "абвгд", то эти значения могут использоваться программой (например, присваиваться переменным) без какой-либо дополнительной обработки. Такие значения обычно называют константами, или литералами.

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

5.4.1. Строковые операции

Если мы имеем дело со строковыми данными, то здесь все предельно просто. Единственная возможная операция - это уже рассмотренная нами конкатенация, для которой может использоваться знак + или ключевое слово add.

Правда, со строковыми данными, как и с числовыми, можно производить операции сравнения. О них мы расскажем отдельно чуть позже.

5.4.2. Арифметические операции

Теперь перейдем к числовым значениям. С ними, прежде всего, можно производить математические действия: сложение (+), вычитание (-), умножение (*), деление (/) и вычисление остатка от деления (%). Обратите внимание на то, что если в сценарии встретится деление на 0, то никакой ошибки с немедленным выходом из программы не произойдет. Просто результатом таких действий являются специальные значения. Если мы, например, напишем

а = 5/0;
b = -2/0;

то при просмотре ролика, нажав клавиши CTRL+ALT+V, получим

Variable _level0.a = 1.#INF
Variable _level0.b = -1.#INF

Как видите, значениями переменных a и b являются некие аналоги понятий +∞ (плюс бесконечность) и -∞ (минус бесконечность). Несмотря на то что эти значения выглядят как строковые, они являются числами - обратите внимание на отсутствие кавычек в листинге значений переменных.

5.4.3. Логические операции

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

При булевой логической операции действия производятся над логическими значениями "истина" и "ложь", для которых в языке ActionScript определены ключевые слова true и false. Результатом также является логическое значение. Если в качестве исходных данных используются числовые значения, то значение 0 трактуется как "ложь" (false), а любое другое значение - как "истина" (true).

Булевы операции

На всякий случай приведем краткое общее описание логических операций. Логических операций всего четыре: И, ИЛИ, НЕ и ИСКЛЮЧАЮЩЕЕ ИЛИ. Операция НЕ использует только одно исходное значение и дает в результате противоположное. Остальные операции используют по два исходных значения.

Результат операции И - "истина", только если оба операнда имеют значение "истина", а в остальных случаях - "ложь". Результат операции ИЛИ - "истина", если хотя бы один из операндов имеет значение "истина". А операция ИСКЛЮЧАЮЩЕЕ ИЛИ дает значение "истина", если значения ее операндов различны.

При побитовой операции одно и то же действие производится с каждым двоичным разрядом (битом) числового значения, и результатом является также число. Например, какой результат даст побитовое ИЛИ между значениями 6 и 7? Представим оба числа в двоичном виде: 110 и 111. Теперь хорошо видно, что в каждом из трех разрядов имеется хотя бы одна единица (соответствующая значению "истина"). Соответственно, и в результате во всех трех разрядах получатся единицы. Следовательно, результат - двоичное 111, или десятичное 7.

А какой результат получится, если произвести операцию побитового И между! значениями 6 и 7? Очевидно, что результат - число 6 (двоичное 110), поскольку только во втором и третьем битах оба эти числа содержат 1. Следовательно, в первом разряде результата останется 0.

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

Побитовые операции

Можно использовать также побитовые логические операции:

В качестве иллюстрации можно привести такой код:

a = 6&7;
b = 6|7;
c = ~6;
cc = !6;
d = 6^7;

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

Variable _level0.а = 6
Variable _level0.b = 7
Variable _level0.c = -7
Variable _level0.cc = false
Variable _level0.d = 1

Неудивляйтесь значению переменной c, которое может показаться неожиданным. Оно связано со способом представления отрицательных чисел в компьютере. Для простоты можно считать, что операторы

a = ~x;

и

a = -x-1;

эквивалентны.

Еще две интересные операции, применяемые в языке ActionScript, - это инкремент (увеличение на 1) и декремент (уменьшение на 1). Например, если написать такой код:

i = 3;
i++;

то в результате переменная i получит значение 4. Инкремент обозначается двумя плюсами, а декремент - двумя минусами.

5.4.4. Операции сравнения

Теперь настало время перейти к операциям сравнения. Они проверяют истинность того или иного утверждения и принимают булево значение true или false. Например, выражение 5>4 (пять больше четырех) имеет значение true, а выражение 2>3 - значение false.

Для сравнения числовых значений могут быть использованы следующие операции:

Кстати, операции сравнения могут быть применены не только к числовым, но и к строковым данным. При этом сравниваются ASCII-коды первых символов, использованных в строках. Если коды первых символов равны, сравниваются коды вторых символов и так далее. Таким образом, строка "abc" больше, чем строка "ABC", поскольку код буквы "a" (97) больше, чем код буквы "А" (65). При сравнении строковых данных можно использовать и старые варианты записи операций сравнения (gt - больше, lt - меньше, ge - больше или равно, - меньше или равно, eq - равно, ne - не равно).

5.4.5. Операции сдвига

Еще один класс операций, используемых в языке ActionScript, - это так называемые операции сдвига. Есть три вида такой операции:

Например, напишем такой код:

а = 40<<2;
b = -40>>2;
bb = -40>>>2;

В листинге переменных увидим следующее:

Variable _level0.a = 160
Variable _level0.b = -10
Variable _level0.bb = 1073741814

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

5.4.6. Составные операции

Кроме того, в языке ActionScript можно использовать так называемые составные операции. Примером такой операции является сложение с присваиванием. Например, запись

z += 2;

означает увеличение значения переменной z на 2. Собственно говоря, вместо предыдущей записи можно написать

z = z+2;

с тем же результатом - к значению переменной z будет прибавлено число 2, и затем результат присвоен переменной z. Однако в последнем случае интерпретатор языка выполнит две операции (сложение и присваивание), в то время как при использовании составной операции - всего одну. Поэтому предпочтительнее использовать составные операции - в результате ролик меньше "тормозит".

Вот какие составные операции можно использовать:

5.4.7. Специальные операции

Заканчивая рассказ об операциях ActionScript, необходимо упомянуть еще о двух. По форме записи эти две операции больше напоминают функции, но реализованы как операции. Первая из них позволяет определить тип данных. Как вы уже знаете, в языке ActionScript тип данных может быть либо числовым, либо строковым; кроме того, существует логический тип данных. В зависимости от типа данных исходного выражения операция typeof возвращает его название. Например, написав

a = 4000;
b = "abc";
c = true;
aa = typeof (a);
bb = typeof (b);
cc = typeof (c);

мы получим в листинге переменных

Variable _level0.a = 4000
Variable _level0.b = "abc"
Variable _level0.c = true
Variable _level0.aa = "number"
Variable _level0.bb = "string"
Variable _level0.cc = "boolean"

Если значение исходной переменной не определено, операция typeof возвращает значение undefined.

Другая операция, по внешнему виду напоминающая функцию, всегда возвращает неопределенное значение. При этом, однако, происходит вычисление исходного выражения. Эта операция имеет синтаксис void(выражение).

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

[ предыдущая страница ] [ следующая страница ] [ содержание ]
Hosted by uCoz