Подскажите, как правильно расставить скобки, например в такой конструкции?
Псевдокод:
if a == 1 or a == 2 and b == 1 or b == 2 and c == 1 or c == 2 then
    //
endif

Принятый ответ

Если лень читать про булеву алегбру, то накидаю в двух словах.
Всё выражение разбирается слева на право. Приоритетов у операторов and и or нет. Скобки считаются отдельным выражением и разбираются когда до них дойдёт очередь.
Всё в выражении приводится к булеан, тобишь к true или false. Вот все комбинации, которые несложно запомнить:
true and true = true
true or true = true
true and false = false
true or false = true

false and false = false
false or false = false
false and true = false
false or true = true
Выделим отсюда true or и false and:
true or true = true
true or false = true
false and false = false
false and true = false
Как видите, в независимости от правого операнда, выражение всегда принимает одинаковое значение. Посему практически во всех яп в таких случаях есть оптимизация: правый операнд, будь то скобка или функция, в таких случая не высчитывается. Но близзарды пошли дальше, и в случае false and вообще не считают всё последующее выражение.
Посему избегайте смешивания and и or в одном выражении если не хотите преисполниться в своём познании:
false and true or true -> false
true and false or true -> true
Напоминаю, скобки создают новое выражение.

UPD. Написал статью где это более подробно расписано.
`
ОЖИДАНИЕ РЕКЛАМЫ...
Этот комментарий удален
0
13
1 месяц назад
0
Например можно по разному, зависит от логически построенной задачей.
0
29
1 месяц назад
0
Разобраться в булевой математике и описать задачу.
В данном конкретном примере скобки не нужны.
0
2
1 месяц назад
0
Вот другой пример:
function Trig_One_Actions takes nothing returns nothing
    local integer a = 1
    local integer b = 1
    local integer c = 1

    if a == 0 and b == 0 or c == 1 then
        call BJDebugMsg("YES")
    else
        call BJDebugMsg("NO")
    endif

endfunction
Ответы (1)
0
29
1 месяц назад
0
Joma, здесь тоже скобки не нужны. Ибо значения a, b, c константны.
0
27
1 месяц назад
Отредактирован MpW
0
По разному, зависит от задачи. Вот неизвестна, что вы хотите достичь
Пример, вот есть у меня абила "укрыться за щитом". И эта двойная кнопка активирует какое-то действие, а можно, и наборот, выключить. Представим, что это кнопка-пустышка для раба создана, и при активации раб бежит добывать лес. Короче, будет авто-добыча. Логика такая, как сделать удобный фильтр, у нас разные условия.
Событие - юнит получает приказ
А - приказ defend
B - приказ undefend
C - приказ добычи, вррде тут несколько приказов. Бпжать добывать, и отнести на склад
Я все id запихал в переменные, типа код длинный получался.
Событие - юнит получает приказ
if id==A then
Бежим рвботать
elseif id==B then
Останавливаемся
elseif id!=C then
Если юнита просто выдернули с работы. То просто еще и кнопку приказом undefend в включенный режим превращаем
endif

Короче, не то. Пример со суобками у меня был в этой системе xgm.guru/p/wc3/auto
0
2
1 месяц назад
0
Joma, здесь тоже скобки не нужны. Ибо значения a, b, c константны.
Интересно, он мне выдает "NO".
Но если я поставлю скобки, так:
if (a == 0 and b == 0) or c == 1 then
Тогда, выдает "YES"
Ответы (1)
0
29
1 месяц назад
0
Интересно, он мне выдает "NO".
Давайте попробуем включить голову посчитать.
Для начала превратим выражение в понятныей boolean
local integer a = 1
local integer b = 1
local integer c = 1
a == 0 and b == 0 or c == 1
И внезапно увидим false and, про особенность которого я написал выше.
false and false or true
4
29
1 месяц назад
Отредактирован nazarpunk
4
Если лень читать про булеву алегбру, то накидаю в двух словах.
Всё выражение разбирается слева на право. Приоритетов у операторов and и or нет. Скобки считаются отдельным выражением и разбираются когда до них дойдёт очередь.
Всё в выражении приводится к булеан, тобишь к true или false. Вот все комбинации, которые несложно запомнить:
true and true = true
true or true = true
true and false = false
true or false = true

false and false = false
false or false = false
false and true = false
false or true = true
Выделим отсюда true or и false and:
true or true = true
true or false = true
false and false = false
false and true = false
Как видите, в независимости от правого операнда, выражение всегда принимает одинаковое значение. Посему практически во всех яп в таких случаях есть оптимизация: правый операнд, будь то скобка или функция, в таких случая не высчитывается. Но близзарды пошли дальше, и в случае false and вообще не считают всё последующее выражение.
Посему избегайте смешивания and и or в одном выражении если не хотите преисполниться в своём познании:
false and true or true -> false
true and false or true -> true
Напоминаю, скобки создают новое выражение.

UPD. Написал статью где это более подробно расписано.
Принятый ответ
Ответы (8)
0
27
1 месяц назад
Отредактирован MpW
0
А=false
B=false
C=A and B --это понятно
Но почему
C or true = false
возвращает false?
0
2
1 месяц назад
0
nazarpunk, Если не совмещать And и Or, то нужно делать вот так:
	local integer a = 1
    local integer b = 1
    local integer c = 1

    if a == 0 and b == 0 then
        call BJDebugMsg("YES")
    elseif c == 1 then
        call BJDebugMsg("YES")
	else
		call BJDebugMsg("NO")
    endif
? Или как?
Просто у меня вместо call BJDebugMsg("YES") может стоят очень много действии и все это копипастить на elseif кажется не красиво)
0
29
1 месяц назад
0
Если не совмещать And и Or, то нужно делать вот так:
Читаем внимательно. Там я что-то про уровни писал. Вот, даже в вашем примере показана отправка and на другой уровень.
if (a == 0 and b == 0) or c == 1 then
	call BJDebugMsg("YES")
else
	call BJDebugMsg("NO")
endif
0
2
1 месяц назад
0
MpW, Знаете, тоже так пробовал, выдает "NO" без скобок ))
	local integer a = 1
    local integer b = 1
    local integer c = 1

    if c == 1 or a == 0 and b == 0 then
        call BJDebugMsg("YES")
    else
        call BJDebugMsg("NO")
    endif
0
29
1 месяц назад
Отредактирован nazarpunk
0
Знаете, тоже так пробовал, выдает "NO" без скобок ))
Заменяем на булеаны и считаем:
c == 1 or a == 0 and b == 0 -> true or false and false -> true and false -> false
0
27
1 месяц назад
0
Joma, ну значит, надо в скобки выражение. Короче, выше ответили. Не путайте других
0
2
1 месяц назад
0
nazarpunk, Хм, понятно, получается если я возьму в скобки - это значит уже другой уровень?
Ну тогда все более менее понятно.
Про уровни я вот не знал)))
0
29
1 месяц назад
0
Joma, уровень не совсем верное слово, исправил ответ и более подробно расписал как считать булеаны.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.