Логические операции в Луа

Столкнулись с проблемой в использовании макросов? Здесь можно получить помощь.
User avatar
zg
zero-gravity
Posts: 5312
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 48 times
Contact:

Логические операции в Луа

Post by zg » Thu 05 Oct, 2017 11:10

Alexey Lubkin wrote:
Thu 05 Oct, 2017 11:08
Странный этот LUA:
Привычные и логичные and и or тут непривычные и нелогичные:
0 and 0 ==> 0
0 and 1 ==> 1
0 and 2 ==> 2
0 and 3 ==> 3
1 and 0 ==> 0
1 and 1 ==> 1
1 and 2 ==> 2
1 and 3 ==> 3
в чём заключается нелогичность?
Last edited by HaRT on Fri 06 Oct, 2017 13:10, edited 1 time in total.
Reason: Добавлена цитата из исходной Темы

Alexey Lubkin
Posts: 106
Joined: Sun 23 Oct, 2005 10:02
Location: Томск
Has thanked: 1 time
Contact:

Перемещение по списку на примере ConEmu Panel Views

Post by Alexey Lubkin » Thu 05 Oct, 2017 11:38

zg wrote:
Thu 05 Oct, 2017 11:10
в чём заключается нелогичность?
В других языках and - это логическое "И": результат истинен, если оба операнда истинны. Вполне логично с точки зрения формальной логики.
Здесь, and - имет отличный от логического "И" смысл, поэтому выглядит очень нелогичным. Результат необязательно будет истинным или ложным. В большинстве случаев он окажется равен второму операнду, каким бы числом не был первый операнд. Единственная ситуация, когда результат берётся не из второго операнда (он игнорируется), это если первый операнд булевый и равен false.

User avatar
John Doe
Бюрократ
Posts: 11419
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 17 times
Been thanked: 101 times

Перемещение по списку на примере ConEmu Panel Views

Post by John Doe » Thu 05 Oct, 2017 11:41

Alexey Lubkin wrote:
Thu 05 Oct, 2017 11:38
Результат необязательно будет истинным или ложным.
Обязательно. Истина только в случае если оба операнда истинны.
При этом:
- nil и false ложны.
- Остальное (в том числе и число) приравнивается к истине.
Alexey Lubkin wrote:
Thu 05 Oct, 2017 11:08
Сбили столку маленькие буквы в документации:
Увы, всё не просто..
http://api.farmanager.com/ru/macro/index.html wrote:РАЗДЕЛ МАКРОСОВ ЯВЛЯЕТСЯ УСТАРЕВШИМ И СОДЕРЖИТ МНОГО НЕСООТВЕТСТВИЙ.
СМ. ДОКУМЕНТ Encyclopedia\macroapi_manual.ru.chm ДЛЯ ПОЛУЧЕНИЯ АКТУАЛЬНОЙ ИНФОРМАЦИИ.

Alexey Lubkin
Posts: 106
Joined: Sun 23 Oct, 2005 10:02
Location: Томск
Has thanked: 1 time
Contact:

Перемещение по списку на примере ConEmu Panel Views

Post by Alexey Lubkin » Thu 05 Oct, 2017 12:03

John Doe wrote:
Thu 05 Oct, 2017 11:41
Alexey Lubkin wrote:
Thu 05 Oct, 2017 11:38
Результат необязательно будет истинным или ложным.
Обязательно.
Перефразирую.
Обычный AND выдаёт одно из двух значений. Например, либо 0, либо 1 (c/c++). Или ещё может быть одно из false/true (pascal).
Здесь результатом AND'а может быть больше двух значний. Наравне с false и true результатом может оказаться любое число, строка или даже функция.
http://api.farmanager.com/ru/macro/index.html wrote:РАЗДЕЛ МАКРОСОВ ЯВЛЯЕТСЯ УСТАРЕВШИМ И СОДЕРЖИТ МНОГО НЕСООТВЕТСТВИЙ.
СМ. ДОКУМЕНТ Encyclopedia\macroapi_manual.ru.chm ДЛЯ ПОЛУЧЕНИЯ АКТУАЛЬНОЙ ИНФОРМАЦИИ.
Скриншот выше как раз из Encyclopedia\macroapi_manual.ru.chm
Last edited by Alexey Lubkin on Thu 05 Oct, 2017 12:03, edited 1 time in total.

User avatar
John Doe
Бюрократ
Posts: 11419
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 17 times
Been thanked: 101 times

Перемещение по списку на примере ConEmu Panel Views

Post by John Doe » Thu 05 Oct, 2017 12:37

Alexey Lubkin wrote:
Thu 05 Oct, 2017 12:03
Здесь результатом AND'а может быть больше двух значний. Наравне с false и
Результатом может быть только одно значение, второй из операндов (при условии что истинны оба, разумеется)
Alexey Lubkin wrote:
Thu 05 Oct, 2017 12:03
Наравне с false и true результатом может оказаться любое число, строка или даже функция.
Да, это непривычно, но документировано и логично.
Alexey Lubkin wrote:
Thu 05 Oct, 2017 12:03
Скриншот выше как раз из Encyclopedia\macroapi_manual.ru.chm
Не совсем.
Из macroapi_manual.ru есть ссылки на старую Энциклопедию. Они открываются в том же окне, что вас и запутало.

Shmuel
Posts: 5232
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 16 times
Been thanked: 152 times

Перемещение по списку на примере ConEmu Panel Views

Post by Shmuel » Thu 05 Oct, 2017 13:05

John Doe wrote:
Thu 05 Oct, 2017 12:37
Результатом может быть только одно значение, второй из операндов (при условии что истинны оба, разумеется)
Сорри, что придираюсь, но точнее будет так:
Результатом операции "and" является 1-й операнд, если он ложен (false или nil), иначе - 2-й операнд.

User avatar
John Doe
Бюрократ
Posts: 11419
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 17 times
Been thanked: 101 times

Перемещение по списку на примере ConEmu Panel Views

Post by John Doe » Thu 05 Oct, 2017 13:20

Shmuel wrote:
Thu 05 Oct, 2017 13:05
Сорри, что придираюсь, но точнее будет так:
Уточнение абсолютно уместное.
Сам собирался выдержку из документации привести:
http://devdocs.io/lua~5.1/index#2.5.3 wrote:The conjunction operator and returns its first argument if this value is false or nil; otherwise, and returns its second argument.

2useven10
Posts: 3045
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 2 times
Been thanked: 84 times

Перемещение по списку на примере ConEmu Panel Views

Post by 2useven10 » Thu 05 Oct, 2017 14:37

John Doe wrote:
Thu 05 Oct, 2017 13:20
Уточнение абсолютно уместное.
Сам собирался выдержку из документации привести:
Эта выдержка есть во 2-м посте топикстартера.

Alexey Lubkin
Posts: 106
Joined: Sun 23 Oct, 2005 10:02
Location: Томск
Has thanked: 1 time
Contact:

Перемещение по списку на примере ConEmu Panel Views

Post by Alexey Lubkin » Thu 05 Oct, 2017 15:46

Ещё один противоестественный момент в нелогичных AND/OR в том, что в отличие от логичных, классических, они несимметричны. Поменяем операнды местами и результат изменится.

User avatar
John Doe
Бюрократ
Posts: 11419
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 17 times
Been thanked: 101 times

Перемещение по списку на примере ConEmu Panel Views

Post by John Doe » Thu 05 Oct, 2017 15:53

Alexey Lubkin wrote:
Thu 05 Oct, 2017 15:46
и результат изменится.
Его истинность не изменится.

Shmuel
Posts: 5232
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 16 times
Been thanked: 152 times

Перемещение по списку на примере ConEmu Panel Views

Post by Shmuel » Thu 05 Oct, 2017 15:58

Alexey Lubkin wrote:
Thu 05 Oct, 2017 15:46
Ещё один противоестественный момент в нелогичных AND/OR [....]
Они не нелогичные, они просто другие. Когда (и если) вы к ним привыкнете (путём постоянного использования), вы измените своё мнение.

User avatar
zg
zero-gravity
Posts: 5312
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 48 times
Contact:

Перемещение по списку на примере ConEmu Panel Views

Post by zg » Thu 05 Oct, 2017 16:27

Alexey Lubkin wrote:
Thu 05 Oct, 2017 15:46
Поменяем операнды местами и результат изменится.
в си то же самое:

Code: Select all

#include <stdio.h>

bool test1(void)
{
  printf("1\n");
  return true;
}

bool test2(void)
{
  printf("2\n");
  return true;
}

bool test3(void)
{
  printf("3\n");
  return true;
}

int main(int argc,char *argv[])
{
  if(test1()||test2()) test3();
  printf("-\n");
  if(test2()||test1()) test3();
  return 0;
}

Code: Select all

C:\1>1.exe
1
3
-
2
3

Alexey Lubkin
Posts: 106
Joined: Sun 23 Oct, 2005 10:02
Location: Томск
Has thanked: 1 time
Contact:

Перемещение по списку на примере ConEmu Panel Views

Post by Alexey Lubkin » Thu 05 Oct, 2017 20:27

zg wrote:
Thu 05 Oct, 2017 16:27
в си то же самое:
Не совсем.
Результат одинаков в обоих случаях, проверить несложно: printf("%d %d\n", test1()||test2(), test2() || test1());
Постоянно включенная "complete boolean evaluation" позволяет избежать лишних вызовов функций, что особенно удобно в ситуациях вроде:
if (pstr && pstr->length()>0) dosomething(*pstr);
Last edited by Alexey Lubkin on Thu 05 Oct, 2017 20:27, edited 1 time in total.

User avatar
zg
zero-gravity
Posts: 5312
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 48 times
Contact:

Перемещение по списку на примере ConEmu Panel Views

Post by zg » Thu 05 Oct, 2017 20:42

Alexey Lubkin wrote:
Thu 05 Oct, 2017 20:27
Результат одинаков в обоих случаях
1≠2, насколько я помню.

Alexey Lubkin
Posts: 106
Joined: Sun 23 Oct, 2005 10:02
Location: Томск
Has thanked: 1 time
Contact:

Перемещение по списку на примере ConEmu Panel Views

Post by Alexey Lubkin » Thu 05 Oct, 2017 21:34

> Результат одинаков в обоих случаях.
1 1
"Результат" - результат вычисления булева выражения. Не "результат выполнения программы".

Smitis
Posts: 1492
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 14 times
Been thanked: 24 times
Contact:

Перемещение по списку на примере ConEmu Panel Views

Post by Smitis » Fri 06 Oct, 2017 07:53

Alexey Lubkin wrote:
Thu 05 Oct, 2017 21:34
"Результат" - результат вычисления булева выражения. Не "результат выполнения программы".
Отвлекитесь от true/false и представьте так:
F это false или nil
T это всё остальное
тогда
F and F -> F
F and T -> F
T and F -> F
T and T -> T
Т.е., всё работет как положено.
Разум когда-нибудь победит.

Post Reply

Return to “Нужна помощь”