x.y
module:f
a[i]
a[%i]
f(x)
x--
x++
x!
x.*
| Доступ к элементу
Функция или переменная модуля
Обращение к элементу контейнера
Обращение к элементу массива ({…если i отрицательно, то индекс считается относительно конца массива})
Вызов функции
Постфиксный декремент
Постфиксный инкремент
Оператор non-null
Разыменование указателя |
^ | Оператор возведения в степень (ассоциативность: справа налево) |
-x
+x
!x
~x
--x
++x
&x
| Унарный минус
Унарный плюс
Логическое НЕ
Поразрядное НЕ (обоснование выбора: {…
Negation - Wikipedia:
- Помимо того, что символ
~ используется для обозначения оператора поразрядного НЕ практически во всех языках программирования, этот символ используется для обозначения эквивалентности в Википедии, а также в некоторых учебниках по математической логике:
Математическая логика (Зыков А.Г., Поляков В.И., Скорубский В.И.), стр. 17:
А эквивалентность обладает некоторыми свойствами аналогичными вычитанию:
Эквивалентность/отрицание | Вычитание/‘изменение знака’ |
~a = 0~a | −a = 0−a |
~(~a) = a | −(−a) = a |
a⊕~b = a~b | a+−b = a−b |
a~~b = a⊕b | a−−b = a+b |
Однако, так как бинарный оператор эквивалентности не имеет аппаратной поддержки и используется крайне редко, в 11l включён только унарный оператор ~, который соответствует поразрядному НЕ.
})
Префиксный декремент
Префиксный инкремент
Оператор взятия адреса |
x * y
x *& y
x / y
x I/ y или x Ц/ y
x -I/ y или x -Ц/ y
x % y
x -% y
| Умножение
Умножение с переполнением (обоснование выбора: {…это соответствует UInt32((Int64(x) * y) [&] FFFF'FFFFh).as(Int32) , а потому *& более логично, чем &* в Swift (ещё есть *% в Zig, что тоже вполне логично [т.к. можно заменить [&] на % : Int32((Int64(x) * y) % 1'0000'0000h) ], но -% в 11l уже занято/используется для Floor-остатка от деления)})
Деление
Целочисленное деление {…примите к сведению, что -5 // 2 = -3 в Python-е, в то время как -5 I/ 2 = -2 в 11l, но это исключительно из соображений производительности, и если вы знаете эффективную реализацию целочисленного деления в стиле Python, тогда, пожалуйста, напишите об этом на форуме}
Floor-деление
Остаток от деления
Floor-остаток от деления ({…результат положительный даже когда x отрицательно}, обоснование выбора: {…операция % в 11l выполняется [из соображений производительности] по правилам C++, а не Python}) |
x""y и x‘’y | Конкатенация строк (обоснование выбора) |
x + y
x - y
x +& y
x -& y | Сложение
Вычитание
Сложение с переполнением
Вычитание с переполнением |
x << y
x >> y | Поразрядный сдвиг влево
Поразрядный сдвиг вправо |
x [&] y | Поразрядное И (обоснование выбора: {…
[&] выглядит похоже на логический вентиль И:
}) |
x (+) y | Поразрядное исключающее ИЛИ (обоснование выбора: {…
Символы (+) похожи на символ ⊕, который используется в алгебре логики\Boolean algebra для обозначения операции ‘исключающего или’/сложения по модулю 2: .
И хотя ⊕ используется чаще для одноразрядных значений, в Википедии встречается его применение для указателей и для массивов из байт. Кроме того, символ ⊕ можно встретить в научных статьях, а также в текстах задач на Codeforces (1, 2).
[К тому же, использовать ^ для данной операции я считаю неудачной идеей (ну, во всяком случае, новичков в программировании это точно сбивает с толку).]
}) |
x [|] y | Поразрядное ИЛИ (обоснование выбора: {…
Символ | похож на 1, а [1] выглядит похоже на логический вентиль ИЛИ:
}) |
x < y, x <= y
x > y, x >= y | Операции сравнения |
x ? y | Вернуть левый операнд если он не нуль, иначе вернуть правый операнд (обоснование выбора: {…
Этот оператор обозначается по-разному в различных языках программирования: в некоторых используется ?: (например, в Kotlin, Groovy, Objective-C), а в некоторых используется ?? (например, в C#, JavaScript, PHP, Swift, PowerShell).
Кроме того, в 11l (так же как в Kotlin), I /if является выражением: оно возвращает значение. Поэтому, в тернарном операторе (условие ? тогда : иначе ) нет необходимости, т.к. I /if прекрасно справляется с его ролью.
}) |
x..y, x.<y, x.+len
x<.y, x<.<y | Диапазоны |
x == y, x != y
e in c, e !in c
e C c, e !C c
| Сравнения
Элемент e содержится/‘не содержится’ в контейнере c |
x & y | Логическое И (обоснование выбора: {…
Используется & вместо && так как:
- Логическое И требуется гораздо чаще, чем поразрядное.
- Поразрядное И практически всегда используется только для проверки установленных флагов, но это чревато ошибками {…
Рассмотрим следующий код на C++:
class Render
{
public:
static const unsigned F_CAST_SHADOWS = 1 << ...;
};
class Control
{
public:
unsigned flags;
static const unsigned F_DISABLED = 1 << ...;
};
void some_func(Control *c)
{
if (c->flags & Control::F_DISABLED) {
...
}
if (c->flags & Render::F_CAST_SHADOWS) { // это неверно, но будет корректно скомпилировано!
...
}
}
Решение 11l:
T Control
T.flags flags
DISABLED
или:
T Control
T Flags
Bool DISABLED
Flags flags
F some_func(Control c)
I c.flags.DISABLED
...
}, поэтому было принято такое решение, чтобы сподвигнуть отказаться от такого использования поразрядного И вообще.
Иногда поразрядное И используется как остаток от деления на число, равное степени двойки, но если второй операнд является константой, тогда лучше использовать оператор % (x [&] y = x % (y + 1) ). Если оператор % работает для отрицательных чисел также как в Python (т.е., например, -1 % 4 = 3 ), тогда выражение x % (y + 1) будет скомпилировано в поразрядное И.
С конвертацией существующего кода на C-подобном языке программирования в 11l проблем такое решение (& вместо && ) не создаёт, так как в том случае, когда вы забудете заменить & на [&] , возникнет ошибка компиляции, так как запись <число> & <число> не действительна в 11l (а действительна только <boolean> & <boolean> , например <число> != 0 & <число> != 0 ).
Символ & в качестве логического И используется также в языках Oberon и ALGOL 68.
}) |
x | y | Логическое ИЛИ |
arr1 [+] arr2 | Конкатенация массивов (обоснование выбора: {…
Так как массивы задаются с использованием квадратных скобок: [1, 2, ...] .
Так как эта операция достаточно дорогая, ей выделен отдельный оператор.
}) |
() -> выражение
x -> выражение
(x, y) -> выражение | Лямбда-выражение |
x = ...
x += ...
-= *= /= I/= Ц/=
%= >>= <<= ^=
[+]= [&]= [|]=
(+)= ‘’= .= | Присваивания (ассоциативность: справа налево) |