JASS
Содержание:
Ветвление это операция, применяющаяся в случаях, когда выполнение или невыполнение некоторого набора команд должно зависеть от выполнения или невыполнения некоторого условия.
if
Базовый и единственный оператор ветвления.
if A then
// этот блок выполнится, если A истинно
endif
else
Необязательный блок, который может существовать только в единственном числе:
if A then
// этот блок выполнится если A истинно
else
// этот блок выполнится если A ложно
endif
elseif
Необязательный блок, количество которых неограничено:
if A then
// этот блок выполнится если A истинно
elseif B then
// этот блок выполнится если A ложно и B истинно
elseif C then
// этот блок выполнится если A ложно, B ложно и C истинно
else
// этот блок выполнится если A ложно, B ложно и C ложно
endif
Условие
В условии может быть всё что угодно, что можно присвоить переменной имеющей тип boolean:
function IsPositive takes integer i returns boolean
return i >= 0
endfunction
function main takes nothing returns nothing
local boolean A = true // логический литерал
local boolean B = IsPositive(3) // результат выполнения функции
local boolean C = 1 != 5 != not true // выражение
if A then
// этот блок выполнится если A истинно
elseif B then
// этот блок выполнится если A ложно и B истинно
elseif C then
// этот блок выполнится если A ложно, B ложно и C истинно
else
// этот блок выполнится если A ложно, B ложно и C ложно
endif
endfunction
Выражения
Выражение это комбинация из одной или нескольких переменных, функций и операторов, результатом интерпретации которого становится некоторое значение.
Операторы
Названы так, потому что провоцируют совершение некоторой операции.
Перечитаем их описание разберём простое выражение:
A = (1 + 2) * 3 > 4 or not true
Запишем его так, как его увидит интерпретатор:
ASSIGN(A, OR(GT(MULT(PAREN(ADD(1,2)), 3),4), NOT(true)))
С виду страшно, но если присмотреться, то всё выражение похоже на вызов функций. В первом приближении так оно и есть. Рассмотрим их подробней:
- ASSIGN (Assignment) - присваивание. Переменной, переданной первым аргументом будет присвоено значение второго аргумента.
- OR - логическое ИЛИ. Вернёт true если один из аргументов равен true. Иначе false.
- GT (Greater Than) - математическое БОЛЬШЕ. Вернёт true если число переданное первым аргументом больше числа переданным вторым аргументом. Иначе false.
- MULT (Multiplication) - математическое умножение. Перемножает два числа и возвращает результат.
- PAREN (Parentheses) - выражение СКОБКИ. Просто возвращает переданный в него аргумент. Служит для смены порядка выполнения операторов.
- ADD (Addition) - математическое сложение. Складывает два числа и возвращает результат.
- NOT - логическое отрицание. Инвертирует логическую переменную. Возврашает true если передано false. Иначе false.
Скобки
Скобки заслуживают более детального рассмотрения ибо их повсеместно употребляют как бог на душу положит. Рассмотрим три выражения:
A = 1 + 2 * 3
B = 1 + (2 * 3)
C = (1 + 2) * 3
По традиции, распишем их в виде функций интерпретатора:
ASSIGN(A, ADD(1, MULT(2, 3)))
ASSIGN(B, ADD(1, PAREN(MULT(2, 3))))
ASSIGN(C, MULT(PAREN(SUM(1, 2)), 3))
Так как PAREN возвращает свой единственный аргумент, то уберём его:
ASSIGN(A, ADD(1, MULT(2, 3)))
ASSIGN(B, ADD(1, MULT(2, 3)))
ASSIGN(C, MULT(SUM(1, 2), 3))
Как видите, выражения A и B эквивалентны и вернут 7. Выражение C изменило порядок, и вернёт 9. Таким нехитрым образом м заставили интерпретатор изменить порядок операций.
Логические операторы
По своей сути мало чем отличаются от математических. Только диапазон значений у них ограничен true и false. Несмотря на это, у многих возникает проблема посчитать простое выражение:
false and true or true
Вспомнив про левую ассоциативность операторов их приоритет представим выражение как функции интерпретатора:
OR(AND(false, true), true)
Так как количество комбинаций невелико, то перечислим все возможные значения функций AND и OR:
Первый аргумент | Оператор | Второй аргумент | Результат |
---|---|---|---|
true | AND | true | true |
true | AND | false | false |
true | OR | true | true |
true | OR | false | true |
false | AND | false | false |
false | AND | true | false |
false | OR | false | false |
false | OR | true | true |
Исходя из этого заключим, что :
- AND возвращает true только в том случае, когда оба аргумента равны true. В остальных случаях возвращает false.
- OR возвращает true только в том случае, когда один из аргумента равен true. В остальных случаях возвращает false.
Обладая этими нехитрыми знаниями, посчитаем наше выражение:
OR(AND(false, true), true)
OR(false, true)
true
Минутка рукожопости
В любом другом языке программирования выполнив эквивалент false and true or true вы получите true или его числовое представление в виде 1. Но выполнив такой код в игре вы сильно удивитесь и можете заподозрить автора сей статьи во всяком.
if false and true or true then
call BJDebugMsg("true")
else
call BJDebugMsg("false")
endif
Разгадка сего действия проста - если первым аргументом функции AND был передан false то игра перестаёт считать выражение и экстренно возвращает false. При этом неважно, будет получен false как значение литерала, из переменной или в результате выполнения функции.
Исправить это можно с помошью скобок:
if (false and true) or true then
call BJDebugMsg("true")
else
call BJDebugMsg("false")
endif
Они расцениваются как отдельное выражение и основное выражение не завершится и будет посчитано правильно:
OR(PAREN(AND(false, true)), true) // здесь будет экстренно завершён PAREN, а не OR, поэтому результат будет верен
OR(false, true)
true
Ленивые операторы
Вернёмся к таблице выше и выделим оттуда две последовательности:
- true OR
- false AND
Первый аргумент | Оператор | Второй аргумент | Результат |
---|---|---|---|
true | OR | true | true |
true | OR | false | true |
false | AND | false | false |
false | AND | true | false |
Как видите, вне зависимости от второго аргумента результат не меняется. Посему интерпретатор в таких случаях не считает второе выражение. В этом легко убедиться передав вторым выражением функцию:
function TEST takes nothing returns boolean
call BJDebugMsg("Это сообщение не будет показано.")
return false
endfunction
function main takes nothing returns nothing
if true or TEST() then
call BJDebugMsg("Это сообщение будет показано.")
endif
endfunction
Содержание
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Приведу пример:
Допустим у нас фильтр, где стоит условие
Итого получается false and true or true.
А если бы было true, юнит бы прошёл фильтр с неподходящим айди, что не должно быть.
Отредактирован nazarpunk
Отредактирован nazarpunk