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

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

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

Post by zg »

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 »

zg wrote: Thu 05 Oct, 2017 11:10в чём заключается нелогичность?
В других языках and - это логическое "И": результат истинен, если оба операнда истинны. Вполне логично с точки зрения формальной логики.
Здесь, and - имет отличный от логического "И" смысл, поэтому выглядит очень нелогичным. Результат необязательно будет истинным или ложным. В большинстве случаев он окажется равен второму операнду, каким бы числом не был первый операнд. Единственная ситуация, когда результат берётся не из второго операнда (он игнорируется), это если первый операнд булевый и равен false.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

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

Post by John Doe »

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 »

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: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

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

Post by John Doe »

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: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

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

Post by Shmuel »

John Doe wrote: Thu 05 Oct, 2017 12:37Результатом может быть только одно значение, второй из операндов (при условии что истинны оба, разумеется)
Сорри, что придираюсь, но точнее будет так:
Результатом операции "and" является 1-й операнд, если он ложен (false или nil), иначе - 2-й операнд.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

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

Post by John Doe »

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: 5192
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 18 times
Been thanked: 309 times

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

Post by 2useven10 »

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 »

Ещё один противоестественный момент в нелогичных AND/OR в том, что в отличие от логичных, классических, они несимметричны. Поменяем операнды местами и результат изменится.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

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

Post by John Doe »

Alexey Lubkin wrote: Thu 05 Oct, 2017 15:46и результат изменится.
Его истинность не изменится.
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

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

Post by Shmuel »

Alexey Lubkin wrote: Thu 05 Oct, 2017 15:46Ещё один противоестественный момент в нелогичных AND/OR [....]
Они не нелогичные, они просто другие. Когда (и если) вы к ним привыкнете (путём постоянного использования), вы измените своё мнение.
User avatar
zg
zero-gravity
Posts: 6015
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

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

Post by zg »

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 »

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: 6015
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

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

Post by zg »

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 »

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

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