О логических операторах

Закрыто
Admin
Главный админ
Сообщения: 214
Зарегистрирован: 28 окт 2021 14:01

О логических операторах

Сообщение Admin »

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

Ошибка многих начинающих программистов автокликера заключается в том, что они воспринимают операцию сравнения, наравне с + - = и тд. Из-за этого возникают различные недопонимания. Ведь несмотря на то, что в операторе сравнения может быть символ =, на самом деле там ничто никуда не присваивается.
По сути, используя любой логический оператор, ВЫ спрашиваете у процессора, “ТАК ЛИ ЭТО”? То есть, когда вы пишите 1==1 Вы как бы спрашиваете: “Правда, что 1 равно 1?” и получаете ответ “правда” только на языке программирования. В java это “true”. Этот результат-ответ может быть помещен в переменную типа boolean. То есть логическую переменную, либо, по-другому, булеву переменную. Этот тип переменных получил свое название в честь профессора Джорджа Буля. Больше о нем можете прочитать в статье на Википедии.
Также, результат логического сравнения, может быть применен непосредственно в условии, которое принимает булев тип. Это while()/if()/for() и другие.
Булева переменная это такой же контейнер, как и int, Image и тд, только для хранения логического значения.

Рассмотрим код:

Код: Выделить всё

boolean result = 1 != 1;

if(result == true)
   log("result equals true");
else
  log("result equal false");
В данном случае вы никогда не попадете в “истинное” ветвление. Потому что вы спросили у процессора: “Правда ли, что 1 не равно 1?” И он вам ответил - нет это ложь, то есть false. При этом результат был помещен в контейнер-переменную с названием result. Дальше, в условном ветвлении, проверяется значение этой переменной и, в зависимости от ее значения, выполняем действие.
Для повышения скорости набора кода, в программировании чаще используется иная, более компактная конструкция, нежели та, которую я привел выше. Выглядит она следующим образом
if(result)
Здесь отсутствует часть “== true”. Но вы должны понимать, что на самом деле она там есть.

Стоит обратить внимание на следующий момент. Вы можете спросить у процессора не только, “правда ли …” но и “ложно ли утверждение, что …?”
Тогда предыдущее условие будет выглядеть так

Код: Выделить всё

 if(result != true)
//либо сокращенный вариант 
 if(!result)
А теперь самое интересное, но в то же время самое страшное для новичков в программировании. Об одном и том же, в некоторых случаях, можно спросить разными способами.
Например

Код: Выделить всё

boolean result = true;

if(result == true)
  log("результат истинный");

if(result != false)
  log("результат не ложный");
В лог будет выведено обе строки. Потому что, то что не равно “ложь” есть “истина” и наоборот.

Только в первом случае вы спрашиваете: “Переменная result имеет истинное значение?” и получаете ответ true, который приводит к выполнению истинного пути условного ветвления.
Во втором же случае спрашиваете: “Переменная result ведь хранит не ложное значение?”, на что процессор отвечает: “Да, true, там не ложное значение”. И во втором условном ветвлении тоже выполняется “истинный путь”.

Теперь внимательно посмотрите на этот код:

Код: Выделить всё

boolean result = false;

if(result != true)
  log("Выполнилось истинное ветвление");

if(result == false)
  log("Выполнилось второе истинное ветвление");
Это, пожалуй, самый яркий пример того, что значение переменных, которые участвуют в операции сравнения, не важны для программы, сами по себе они ни на что не влияют. Значение просто существует в зависимости от обстоятельств, а вот как должна поступить программа в том или ином случае, решает программист.
Оператор условного перехода if сработает только в случае, если результат выражения внутри круглых скобок, возвратит true. Несмотря на то, что переменная result равна false, в обоих случаях в лог будет помещена строка. Ведь в первом выражении мы спросили: “Результат ведь не истинный?”, а во втором: “Результат ведь ложный?” На что получили ответы “true, результат не истинный” и “true, результат ложный”.
Вот такая вот, казалось бы, абракадабра, которая, при этом, абсолютно логична.

Все вышесказанное касается и других операторов, которые работают с логическими значениями. Рассмотрим, для примера, цикл while.
Когда вы пишите while( !EXIT ) это не какая-то там страшная конструкция, придуманная Альбусом Дамблдором. while это один из нескольких видов циклов. Он выполняется только до тех пор, пока логический результат, полученный после вычисления значения, записанного в круглых скобках, равен true. Перепишем условие более наглядно while( EXIT != true) . Наверное, у вас должен возникнуть вопрос: “А что же тогда такое этот EXIT” , а это самая обыкновенная переменная, которая зашита в каждом скрипте по умолчанию и имеет значение false. По крайней мере до тех пор, пока вы не нажмете кнопку остановки скрипта. Тогда в нее помещается значение true, что и приводит к выходу из цикла.
То есть, объявляя условие “бесконечного” цикла таким образом, вы спрашиваете: ”Правда ли, что переменная EXIT не содержит истинное значение?” Процессор отвечает true. Это true как бы “помещается” между круглых скобок вместо условия, и цикл while проходит еще одну итерацию. Если написать while(EXIT == false) результат будет точно таким же. Просто о значении переменной, вы спросите другими словами.

Очень надеюсь, что смог хоть немного улучшить ваше понимание данной темы. Если же это не так, создайте тему, либо напишите мне в ЛС и расскажите, как я могу улучшить данную статью. До встречи!
Закрыто