в чём заключается нелогичность?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
Логические операции в Луа
- zg
- zero-gravity
- Posts: 6016
- Joined: Tue 15 Mar, 2005 17:36
- Location: riga
- Been thanked: 185 times
- Contact:
Логические операции в Луа
Last edited by HaRT on Fri 06 Oct, 2017 13:10, edited 1 time in total.
Reason: Добавлена цитата из исходной Темы
Reason: Добавлена цитата из исходной Темы
-
- Posts: 106
- Joined: Sun 23 Oct, 2005 10:02
- Location: Томск
- Has thanked: 1 time
- Contact:
Перемещение по списку на примере ConEmu Panel Views
В других языках and - это логическое "И": результат истинен, если оба операнда истинны. Вполне логично с точки зрения формальной логики.
Здесь, and - имет отличный от логического "И" смысл, поэтому выглядит очень нелогичным. Результат необязательно будет истинным или ложным. В большинстве случаев он окажется равен второму операнду, каким бы числом не был первый операнд. Единственная ситуация, когда результат берётся не из второго операнда (он игнорируется), это если первый операнд булевый и равен false.
- John Doe
- Бюрократ
- Posts: 13807
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 73 times
- Been thanked: 426 times
- Contact:
Перемещение по списку на примере ConEmu Panel Views
Обязательно. Истина только в случае если оба операнда истинны.
При этом:
- nil и false ложны.
- Остальное (в том числе и число) приравнивается к истине.
Увы, всё не просто..
http://api.farmanager.com/ru/macro/index.html wrote:РАЗДЕЛ МАКРОСОВ ЯВЛЯЕТСЯ УСТАРЕВШИМ И СОДЕРЖИТ МНОГО НЕСООТВЕТСТВИЙ.
СМ. ДОКУМЕНТ Encyclopedia\macroapi_manual.ru.chm ДЛЯ ПОЛУЧЕНИЯ АКТУАЛЬНОЙ ИНФОРМАЦИИ.
-
- Posts: 106
- Joined: Sun 23 Oct, 2005 10:02
- Location: Томск
- Has thanked: 1 time
- Contact:
Перемещение по списку на примере ConEmu Panel Views
Перефразирую.
Обычный AND выдаёт одно из двух значений. Например, либо 0, либо 1 (c/c++). Или ещё может быть одно из false/true (pascal).
Здесь результатом AND'а может быть больше двух значний. Наравне с false и true результатом может оказаться любое число, строка или даже функция.
Скриншот выше как раз из Encyclopedia\macroapi_manual.ru.chmhttp://api.farmanager.com/ru/macro/index.html wrote:РАЗДЕЛ МАКРОСОВ ЯВЛЯЕТСЯ УСТАРЕВШИМ И СОДЕРЖИТ МНОГО НЕСООТВЕТСТВИЙ.
СМ. ДОКУМЕНТ Encyclopedia\macroapi_manual.ru.chm ДЛЯ ПОЛУЧЕНИЯ АКТУАЛЬНОЙ ИНФОРМАЦИИ.
Last edited by Alexey Lubkin on Thu 05 Oct, 2017 12:03, edited 1 time in total.
- John Doe
- Бюрократ
- Posts: 13807
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 73 times
- Been thanked: 426 times
- Contact:
Перемещение по списку на примере ConEmu Panel Views
Результатом может быть только одно значение, второй из операндов (при условии что истинны оба, разумеется)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 есть ссылки на старую Энциклопедию. Они открываются в том же окне, что вас и запутало.
-
- Posts: 6820
- Joined: Thu 23 Mar, 2006 21:36
- Location: Israel
- Has thanked: 41 times
- Been thanked: 528 times
Перемещение по списку на примере ConEmu Panel Views
Сорри, что придираюсь, но точнее будет так:
Результатом операции "and" является 1-й операнд, если он ложен (false или nil), иначе - 2-й операнд.
- John Doe
- Бюрократ
- Posts: 13807
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 73 times
- Been thanked: 426 times
- Contact:
Перемещение по списку на примере ConEmu Panel Views
Уточнение абсолютно уместное.
Сам собирался выдержку из документации привести:
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.
-
- Posts: 106
- Joined: Sun 23 Oct, 2005 10:02
- Location: Томск
- Has thanked: 1 time
- Contact:
Перемещение по списку на примере ConEmu Panel Views
Ещё один противоестественный момент в нелогичных AND/OR в том, что в отличие от логичных, классических, они несимметричны. Поменяем операнды местами и результат изменится.
- John Doe
- Бюрократ
- Posts: 13807
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 73 times
- Been thanked: 426 times
- Contact:
-
- Posts: 6820
- Joined: Thu 23 Mar, 2006 21:36
- Location: Israel
- Has thanked: 41 times
- Been thanked: 528 times
Перемещение по списку на примере ConEmu Panel Views
Они не нелогичные, они просто другие. Когда (и если) вы к ним привыкнете (путём постоянного использования), вы измените своё мнение.Alexey Lubkin wrote: ↑Thu 05 Oct, 2017 15:46Ещё один противоестественный момент в нелогичных AND/OR [....]
- zg
- zero-gravity
- Posts: 6016
- Joined: Tue 15 Mar, 2005 17:36
- Location: riga
- Been thanked: 185 times
- Contact:
Перемещение по списку на примере ConEmu Panel Views
в си то же самое:
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
-
- Posts: 106
- Joined: Sun 23 Oct, 2005 10:02
- Location: Томск
- Has thanked: 1 time
- Contact:
Перемещение по списку на примере ConEmu Panel Views
Не совсем.
Результат одинаков в обоих случаях, проверить несложно: 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.
- zg
- zero-gravity
- Posts: 6016
- Joined: Tue 15 Mar, 2005 17:36
- Location: riga
- Been thanked: 185 times
- Contact:
-
- Posts: 106
- Joined: Sun 23 Oct, 2005 10:02
- Location: Томск
- Has thanked: 1 time
- Contact:
Перемещение по списку на примере ConEmu Panel Views
> Результат одинаков в обоих случаях.
1 1
"Результат" - результат вычисления булева выражения. Не "результат выполнения программы".
1 1
"Результат" - результат вычисления булева выражения. Не "результат выполнения программы".