Логические операторы

Математическая логика была разработана в середине XIX в. ученым-самоучкой Булем (отсюда — булевы величины). Первоначально она предназначалась для того, чтобы можно было в абстрактной форме описать особенности человеческого мышления. Породив несколько парадоксов, математическая логика оставалась чисто теоретической дисциплиной вплоть до появления первых вычислительных машин, когда реально пригодились ее наработки: оказалось, что, используя аппарат математической логики, можно чрезвычайно просто записывать алгоритмы.

Математическая логика оперирует понятиями «истина» (логическая 1) и «ложь» (логический 0). В ActionScript им соответствуют величины true (от английского «истина») и false (от английского «ложь») типа boolean. Кроме того, логические операции возможно проводить и над двоичными числами.

В ActionScript имеются 3 оператора, находящие отображение в традиционной математической логике:

• && (логическое И, или логическое умножение, конъюнкция (^)). Если оба высказывания являются истинными, то операция логического И возвращает истину. Если одно или оба высказывания ложны, то результат – ложь.

• || (логическое ИЛИ, или логическое сложение, дизъюнкция( ∨ )).


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

• ! (логическое НЕ, или логическое отрицание, инверсия ( ¬ )). Ложь преобразует в истину, а истину в ложь.

При создании алгоритмов иногда нужна операция исключающего ИЛИ. Эта операция, в отличие от простой дизъюнкции, возвращает истину, если истинно только одно из высказываний. Если оба операнда хранят истину, то результат ложь. К сожалению, в ActionScript нет оператора исключающего ИЛИ. Впрочем, он легко может быть эмулирован

В качестве аргументов логические операторы принимают булевы величины. Результатом их работы является булева величина. Например:

trace(true && true); // Выводит: true (1*1=1 (конъюнкция – логическое
// умножение))
trace(true && false); // Выводит: false (1*0=0)
trace(true || false); // Выводит: true(1+0=1 (дизъюнкция – логическое
// суммирование))
trace(false || false); // Выводит: false (0+0=0)
trace(!true); // Выводит: false

Если тип операндов, переданных логическому оператору, отличен от boolean, то осуществляется привидение типа к нужному:

trace("1" && true); // Выводит: true (строка "1" преобразуется в true)
trace("true"||"false"); // Выводит: true ("true" и "false" преобразуется
// в true)
trace(1 || 0); // Выводит: 1
trace(![1,2,3]); // Выводит: true (любой объект преобразуется в true)

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

Почему при передаче «||» в качестве операндов чисел 0 и 1 в качестве результата была возвращена 1? Ведь в том, чтобы преобразовать числа в булевы величины, нет никакой сложности (0 и NaNдает false, остальные значения – true).


Чтобы ответить на этот вопрос, проанализируем алгоритм операции логического ИЛИ, приведенный в спецификации ECMA-262:

1. Вычислить выражение левого операнда оператора «||»
2. Результат полученный в п.1, преобразовать в тип boolean.
3. Если результат п. 2 равен true, возвратить результат в п. 1.
4. Если результат п. 2 равен false, вычислить выражение правого операнда и возвратить полученное значение.

Анализ данного алгоритма позволяет сделать крайне интересный вывод. Оказывается, бинарные логические операторы (но не «!») возвращают один из своих операндов, а не сгенерированное по итогам анализа переданных данных булево значение. А это означает, что результатом их использования может быть не только true или false, но и число, массив или даже клип. Например:

trace(_root || _global); // Выводит: level0
trace([1, 2, 3] || [3, 4, 5]); // Выводит: 1,2,3

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



Оцените статью: (0 голосов)
0 5 0

Статьи из раздела Action Script на эту тему:
Арифметические операторы
Виды операторов
Операторы равенства и сравнения
Поразрядные операторы
Служебные операторы

Вернуться в раздел: Action Script / 5. Операторы