Операторы
Нет смысла изучать язык только теоретически. Нужно обязательно практиковаться. К тому же, так будет интереснее.
Мы пока изучили только работу с переменными и не дошли до функций, поэтому просто и без объяснений реквизируем команду print из примера в одной из первых глав. Не будем разбираться, что это такое и как оно работает. Просто примем за данность, что если мы напишем:
print(<что-то>)
то всё, что окажется внутри круглых скобок, будет напечатано в консоль. Так мы сможем видеть, что происходит в программе.
Также представим себе, что в начале программы уже объявлены две переменные:
local a, b = 10, 6
На практике все операторы можно проверить в интерпретаторе Lua в OpenOS, либо написать программу в отдельном файлике и запустить его.
Кроме того, можно воспользоваться онлайн демкой Lua по адресу: http://www.lua.org/cgi-bin/demo
Теперь можно и поэксперименировать.
Математические операторы
Lua предоставляет нам целый набор операторов для работы над числами. Они практически идентичны тем, что используются в математике.
| Оператор | Значение | Пример |
|---|---|---|
* |
умножить | a * b равно 60 |
/ |
разделить | a / b равно 1.6666666666667 |
+ |
сложить | a + b равно 16 |
- (бинарный минус) |
вычесть | a - b равно 4 |
% |
остаток от деления | a % b равно 4 (целая часть — 6, и 4 в остатке) |
^ |
возвести в степень | a ^ b равно 1000000.0 |
- (унарный минус) |
противоположное число (отрицательное в положительное и наоборот) | -a равно -10 |
Логические операторы
Логические операторы предназначены для работы с логическими значениями — то есть с булевыми.
Каждая логическая операция берёт два каких-либо аргумента и в качестве результата возвращает true или false. Тут всё тоже довольно просто.
| Оператор | Значение | Пример |
|---|---|---|
== |
возвращает true, если левая часть равна правой |
a == b равно false |
~= |
возвращает true, если левая часть не равна правой |
a ~= b равно true |
> |
возвращает true, если левая часть больше правой |
a > b равно true |
< |
возвращает true, если левая часть меньше правой |
a < b равно false |
>= |
возвращает true, если левая часть больше или равна правой |
a >= b равно true |
<= |
возвращает true, если левая часть меньше или равна правой |
a <= b равно false |
Все эти операторы очень пригодятся в следующей главе «Условия и циклы».
Кроме операторов сравнения, есть ещё три специальных оператора, которые в качестве аргументов берут логические значения. Они не имеют своих знаков в Lua, а пишутся словом:
| Оператор | Значение | Пример |
|---|---|---|
and |
логическое И, возвращает true, только если обе части тоже равны true |
true and false равно false |
or |
логическое ИЛИ, возвращает true, если хотя бы одна часть равна true |
true and false равно true |
not |
логическое НЕ, берёт только один аргумент и возвращает противоположное | not true равно false |
Специальные операторы
Кроме логических и математических есть ещё несколько операторов для всяких вспомогательных действий:
| Оператор | Значение | Пример |
|---|---|---|
.. |
конкатенация — предназначена для склеивания нескольких строк в одну | "hello" .. "world" равно "helloworld" |
( ) |
скобки — изменяют порядок вычислений, как в математике | (a + a) * b равно 120 |
# |
длина таблицы — позволяет узнать количество элементов списка | #{1, 2, 3} равно 3 |
Последний оператор изучим дополнительно в главе «Таблицы». А пока посмотрим на скобки. Что такое «порядок вычислений»?
Порядок вычислений
Допустим, у нас есть очень сложная формула:
local c = a * b + a - b / a ^ 2
Чему будет равно c ? Сложно сказать, правда? Не очень понятно с чего начать, что на что умножать и после чего.
Специально для того, чтобы облегчить программисту и компьютеру эту задачу, существует табличка "силы" операторов.
Вот она. Сверху - самые сильные операторы, снизу самые слабые.
| Сила | Операторы | Порядок вычислений |
|---|---|---|
| 1 | ^ |
справа налево |
| 2 | not, #, - (унарный минус) |
справа налево |
| 3 | *, /, % |
слева направо |
| 4 | +, - (бинарный минус) |
слева направо |
| 5 | .. |
справа налево |
| 6 | <, >, <=, >=, ==, ~= |
слева направо |
| 7 | and |
слева направо |
| 8 | or |
слева направо |
Формула начинает вычисляться от самых сильных операторов к самым слабым. Однако этот порядок можно изменить скобками. То, что находится внутри скобок, вычисляется раньше, чем то, что снаружи.
Например, в случае очень сложной формулы, что выше, это будет так:
local c = a * b + a - b / a ^ 2
= (a * b) + a - (b / (a ^ 2)) -- упрощаем и делаем понятнее
= 60 + 10 - (6 / 100) -- подставляем значения переменных
= 70 - 0.06
= 69.94 -- вуаля!
На практике, конечно, не стоит писать такие запутанные формулы, и всегда лучше явно разделить их скобками. Так будет проще понять, что происходит, с одного взгляда на формулу.
Также обратите внимание на пробелы, которые поставлены до и после операторов. Формула, разделённая пробелами, читается лучше, чем сплошная масса знаков. Это тоже одно из правил «чистого кода».