JASS Help

Ленивое вычисление

Рассмотрим поближе совокупную таблицу операторов and и or:

a

b

a and b

a or b

true

true

true

true

false

false

true

false

true

false

true

false

false

false

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

function A takes nothing returns boolean call ConsolePrint("Это сообщение не будет показано.") return false endfunction function main takes nothing returns nothing if true or A() then call ConsolePrint("Это сообщение будет показано.") endif endfunction

Минутка рукожопости

В любом другом языке программирования выполнив эквивалент false and true or true вы получите true или его числовое представление в виде 1. Но выполнив такой код в игре вы сильно удивитесь и можете заподозрить автора сей статьи во всяком.

if false and true or true then call ConsolePrint("true") else call ConsolePrint("false") endif

Разгадка сего действия проста - если первым аргументом функции and был передан false то игра перестаёт считать выражение и экстренно возвращает false.

Исправить это можно с помощью скобок:

if (false and true) or true then call BJDebugMsg("true") else call BJDebugMsg("false") endif
Last modified: 22 October 2024