Логические операторы 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.

Другие вопросы по тегам