Логические операторы Lua отличаются от других языков?
Так что я начал возиться с логическими операторами Луа и, или нет. Как указано здесь print (4 and 5)
вернусь 5
в то время как print (4 or 5)
вернусь 4
, Если вы затем переключаетесь вокруг номеров, чтобы он сказал print (5 and 4)
это вернется 4
, Я понял объяснение, что оператор and возвращает первый операнд, если он ложный, и второй, если это правда, но я привык к языкам, таким как C++, таков: print (4 and 5)
возвращается 4
, Как получить тот же результат, что и в C++ или аналогичных языках?
3 ответа
and
/or
Операторы возвращают истинное значение следующим образом:
or
Первое истинное значение при оценке слева направо после следования приоритету оператора. Вот почему вы получаете 4
когда print(4 or 5)
был выполнен.
and
Последнее истинное значение, встреченное в цепочке and
операции. Поэтому вы получаете 4
когда вы делаете print(5 and 4)
,
Приведенные выше правила - вот почему вы можете связать and/or
Операции для работы в качестве троичного оператора при выполнении:
condition and expression or expression
-- which in C/C++ would be (condition) ? expression : expression
Если вы путаете and
с &
из языков Си / Си ++ вместо этого следует использовать побитовые операторы.
&
: поразрядное И|
: побитовый ИЛИ~
: битовое исключающее ИЛИ>>
: сдвиг вправо<<
: Сдвиг влево~
: одинарный поразрядно НЕ
Для Луа 5.2:
print( bit32.band(4, 5) )
дам тебе 4
,
Этот код C печатает 4
printf("%d\n", 4 & 5);
но это случайность из-за двоичного представления 4
,
Действительно, код ниже печатает 4
который не является ни 5
ни 6
:
printf("%d\n", 5 & 6);
Если вы используете логическое и, то этот код печатает 1
не 4
или же 5
,
printf("%d\n", 4 && 5);
Вы путаете то, что делает оператор & в C/C++. Это побитовая и операция, означающая, что она смотрит на двоичное представление цифр.
По сути, оператор & просматривает каждое двоичное значение места в двух числах, сохраняя 1, если оба значения равны 1, или 0, если любое из них равно нулю. На практике:
0 1 0 0 // 4 in binary
& 0 1 0 1 // 5 in binary
------------
0 1 0 0 // also 4 in binary
Функция и в Lua совершенно другая. Вы сказали, что поняли, что он делает, поэтому я не буду объяснять это снова, но оператор & в C-подобных языках делает что-то совершенно другое. Он работает только с числами, и из-за статической типизации на этих языках ключевое слово and возвращает только логическое значение true или false, а не какое-либо конкретное значение, как Lua.
Надеюсь это поможет. На случай, если вы захотите сделать что-то вроде переменной в качестве значения, основанного на простом тесте, например, если оно больше определенного числа или по умолчанию в противном случае, вы можете сделать что-то вроде этого (в Lua):
local a = 4
local var = (a > 5) and a or 5
Это позволит вам, среди прочего, установить минимальное значение, которое может быть без полных блоков if/else.