Добавлен , опубликован

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

`
ОЖИДАНИЕ РЕКЛАМЫ...
0
18
3 недели назад
0
Хм, а по моему, false and сделано правильно и не должно никогда возвращать true.
Приведу пример:
Допустим у нас фильтр, где стоит условие
return GetUnitTypeId ( GetFilterUnit() ) == 'httt' and GetUnitAbilityLevel ( GetFilterUnit(), 'Addd' ) > 0 or GetUnitAbilityLevel ( GetFilterUnit(), 'Adds' ) > 0
И у нас при проверке айди юнита не совпадает, то есть выдаёт false, но обе абилки имеются.
Итого получается false and true or true.
Поскольку юнит не проходит по ид, он отсеивается, что правильно.
А если бы было true, юнит бы прошёл фильтр с неподходящим айди, что не должно быть.
Ответы (2)
0
29
3 недели назад
Отредактирован nazarpunk
0
EugeAl, а теперь поменяй местами операнды и расскажи, насколько оно праильно сделано:
true and false or true
0
18
2 недели назад
0
nazarpunk, Но речь то шла именно об этом
В любом другом языке программирования выполнив эквивалент false and true or true вы получите true или его числовое представление в виде 1. Но выполнив такой код в игре вы сильно удивитесь и можете заподозрить автора сей статьи во всяком.
Разгадка сего действия проста - если первым аргументом функции AND был передан false то игра перестаёт считать выражение и экстренно возвращает false.
А не о других комбинациях.
В случае с true and false я без понятия, как оно будет проверять, потому что игра не вернет экстренно false.
0
18
2 недели назад
0
Разгадка сего действия проста - если первым аргументом функции AND был передан false то игра перестаёт считать выражение и экстренно возвращает false
Тут хорошо бы уточнить подразумевается false как значение выражения или false как переменная "false", и если первое то получается все выражения с and надо оборачивать в скобки
Ответы (1)
1
29
2 недели назад
Отредактирован nazarpunk
1
Тут хорошо бы уточнить подразумевается false как значение выражения или false как переменная "false"
Уточнил.
и если первое то получается все выражения с and надо оборачивать в скобки
Скобки нужно использовать, если в одном выражении есть операторы and и or. К примеру, зачем скобки в таком выражении?
false and true and true and true and true
0
1
2 недели назад
0
Кайф
Чтобы оставить комментарий, пожалуйста, войдите на сайт.