Основные операторы в Julia

Оператор — это символ, который указывает компилятору выполнить определённые математические или логические операции, такие как:3+2=5。

Язык Julia имеет богатый набор встроенных операторов. Поддерживаются следующие операции:

  • Арифметические операторы
  • Логические операторы
  • Операторы отношения
  • Побитовые операторы
  • Операторы присваивания
  • Векторизованные "точечные" операторы

Арифметические операторы

В следующей таблице показаны базовые арифметические операторы Julia, которые применимы ко всем базовым числовым типам:

Выражение Name Описание
+x Унарный оператор плюс Тождественная операция
-x Унарный оператор минус Преобразует значение в его отрицательное значение
x + y Бинарный оператор сложения Складывает два числа
x - y Бинарный оператор вычитания Вычитает два числа
x * y Оператор умножения Умножает два числа
x / y Оператор деления Делит два числа
x ÷ y Целочисленное деление Берёт целую часть от x / y
x \ y Обратное деление Эквивалентноy / x
x ^ y Оператор возведения в степень xизyВозведение в степень
x % y Остаток Эквивалентноrem(x,y)

Примеры

julia> 1 + 2 + 3
6
julia> 1 - 2
-1
julia> 3*2/12
0.5
julia> 2+20-5
17
julia> 50*2/10
10.0
julia> 23%2
1
julia> 2^4
16

Логические операторы

В следующей таблице показаны логические операторы Julia:

Выражение Name
!x Отрицание
x && y Логическое И с сокращённым вычислением. В выражении x && y подвыражение y выполняется только если x истинно.
x || y Логическое ИЛИ с сокращённым вычислением. В выражении x || y подвыражение y выполняется только если x ложно.

Примеры

julia> !true
false

julia> !false
истина

julia> true && (x = (1, 2, 3))
(1, 2, 3)

julia> false && (x = (1, 2, 3))
false

julia> false || (x = (1, 2, 3))
(1, 2, 3)

Операторы отношения

В следующей таблице показаны операторы сравнения Julia:

Operator Name
== Равенство
!=, ≠ Неравенство
< Меньше
<=, ≤ Меньше или равно
> Больше
>=, ≥ Больше или равно

Примеры

julia> 100 == 100
истина

julia> 100 == 101
false

julia> 100 != 101
истина

julia> 100 == 100.0
истина

julia> 100 < 500
истина

julia> 100 > 500
false

julia> 100 >= 100.0
истина

julia> -100 <= 100
истина

julia> -100 <= -100
истина

julia> -100 <= -500
false

julia> 100 < -10.0
false

Цепочные сравнения

Цепочные сравнения особенно удобны при написании численного кода. Они используют оператор && для сравнения скаляров, а для массивов используют & для поэлементного сравнения. Например, 0 .< A .< 1 даёт логический массив, все элементы которого равны true, если все элементы A находятся между 0 и 1.

Julia допускает цепочные сравнения:

Примеры

julia> 1 < 2 <= 2 < 3 == 3 > 2 >= 1 == 1 < 3 != 5
истина

Обратите внимание на порядок вычисления цепочных сравнений:

Примеры

julia> M(a) = (println(a); a)
M (обобщённая функция с 1 методом)
julia> M(1) < M(2) <= M(3)
 2
 1
 3
истина
julia> M(1) > M(2) <= M(3)
 2
 1
false

Побитовые операторы

В следующей таблице показаны побитовые операторы Julia:

Выражение Name
~x Побитовое НЕ
x & y Побитовое И
x | y Побитовое ИЛИ
x ⊻ y Побитовое исключающее ИЛИ (логическое исключающее ИЛИ)
x ⊼ y Побитовое И-НЕ
x ⊽ y Побитовое ИЛИ-НЕ
x >>> y Логический сдвиг вправо
x >> y Арифметический сдвиг вправо
x << y Логический/арифметический сдвиг влево

Примеры

julia> ~123
-124

julia> 123 & 234
106

julia> 123 | 234
251

julia> 123 ⊻ 234
145

julia> xor(123, 234)
145

julia> nand(123, 123)
-124

julia> 123 ⊼ 123
-124

julia> nor(123, 124)
-128

julia> 123 ⊽ 124
-128

julia> ~UInt32(123)
0xffffff84

julia> ~UInt8(123)
0x84

Операторы присваивания

Каждый бинарный оператор и побитовый оператор может выполнять составное присваивание левому операнду, помещая = непосредственно после бинарного оператора. Например,x += 3эквивалентно x = x + 3 。

В следующей таблице показаны операторы присваивания Julia:

OperatorОписаниеПример
=Простой оператор присваивания: присваивает значение правого операнда левому операнду.C = A + B присваивает значение A + B переменной C
+=Оператор сложения с присваиванием: присваивает левому операнду результат прибавления правого операнда к левому операнду.C += A эквивалентно C = C + A
-=Оператор вычитания с присваиванием: присваивает левому операнду результат вычитания правого операнда из левого операнда.C -= A эквивалентно C = C - A
*=Оператор умножения с присваиванием: присваивает левому операнду результат умножения правого операнда на левый операнд.C *= A эквивалентно C = C * A
/=Оператор деления с присваиванием: присваивает левому операнду результат деления левого операнда на правый операнд.C /= A эквивалентно C = C / A
%=Оператор взятия остатка с присваиванием: присваивает левому операнду остаток от деления двух операндов.C %= A эквивалентно C = C % A
<<=Оператор сдвига влево с присваиваниемC <<= 2 эквивалентно C = C << 2
>>=Оператор сдвига вправо с присваиваниемC >>= 2 эквивалентно C = C >> 2
&=Оператор побитового И с присваиваниемC &= 2 эквивалентно C = C & 2
^=Побитовый оператор исключающего ИЛИ с присваиваниемC ^= 2 эквивалентно C = C ^ 2
|=Побитовый оператор ИЛИ с присваиваниемC |= 2 эквивалентно C = C | 2
>>>=Оператор логического сдвига вправо с присваиваниемC >>>= 2 эквивалентно C = C >>>2
⊻=Оператор присваивания XOR (логическое исключающее ИЛИ)C ⊻= 2 эквивалентно C = C ⊻= 2

Примеры

julia> x = 1
1

julia> x += 3
4

julia> x
4

Векторизованные "точечные" операторы

В Julia у каждого бинарного оператора есть соответствующий «точечный» оператор; например,^существует соответствующий.^. Этот соответствующий.^автоматически определяется Julia для выполнения поэлементной^операции. Например,[1,2,3] ^ 3недопустимо, потому что математика не определила куб массива (с разной длиной строк и столбцов). Но[1,2,3] .^ 3допустимо в Julia, и оно выполняет операцию ^ поэлементно (также называемую векторизованной операцией), давая [1^3, 2^3, 3^3]. Аналогично,!или√унарные операторы, подобные этому, также имеют соответствующий.√ , используемый для выполнения поэлементных операций.

Примеры

julia> [1,2,3] .^ 3
3-элементный Vector{Int64}:
  1
  8
 27

Помимо точечных операторов, у нас также есть поэлементные операторы присваивания, например,a .+= b(или@. a += b) разбирается какa .= a .+ b。


Приоритет операторов и ассоциативность

Приоритет операторов определяет группировку членов в выражении. Это влияет на то, как вычисляется выражение. Некоторые операторы имеют более высокий приоритет, чем другие; например, операторы умножения и деления имеют более высокий приоритет, чем операторы сложения и вычитания.

Напримерx = 7 + 3 * 2, здесь x присваивается 13 вместо 20, потому что оператор*имеет+более высокий приоритет, поэтому умножение 3*2 вычисляется первым, а затем прибавляется к 7.

В следующей таблице операторы перечислены по приоритету от наивысшего к наинизшему. Операторы с более высоким приоритетом расположены в верхней части таблицы, а операторы с более низким приоритетом — в нижней. В выражении операторы с более высоким приоритетом вычисляются первыми.

Категория Operator Ассоциативность
Синтаксис . за которым следует :: Левоассоциативные
Возведение в степень ^ Правоассоциативные
Унарные операторы + - √ Правоассоциативные
Операции сдвига << >> >>> Левоассоциативные
Деление // Левоассоциативные
Умножение * / % & \ ÷ Левоассоциативные
Сложение + - | ⊻ Левоассоциативные
Синтаксис : .. Левоассоциативные
Синтаксис |> Левоассоциативные
Синтаксис <| Правоассоциативные
Сравнение > < >= <= == === != !== <: Неассоциативные
Управление потоком && за которым следует || за которым следует ? Правоассоциативные
Операции с парами => Правоассоциативные
Присваивание = += -= *= /= //= \= ^= ÷= %= |= &= ⊻= <<= >>= >>>= Правоассоциативные

Мы также можем использовать встроенную функциюBase.operator_precedenceчтобы просмотреть значение приоритета любого заданного оператора; чем больше значение, тем выше приоритет.

Примеры

julia> Base.operator_precedence(:+), Base.operator_precedence(:*), Base.operator_precedence(:.)
(11, 12, 17)

julia> Base.operator_precedence(:sin), Base.operator_precedence(:+=), Base.operator_precedence(:(=))  # (Примечание: вокруг знака равенства `:(=)` должны быть круглые скобки)
(0, 1, 1)

Кроме того, встроенные функцииBase.operator_associativityмогут возвращать символьное представление ассоциативности операторов:

Примеры

julia> Base.operator_associativity(:-), Base.operator_associativity(:+), Base.operator_associativity(:^)
(:left, :none, :right)

julia> Base.operator_associativity(:⊗), Base.operator_associativity(:sin), Base.operator_associativity(:→)
(:left, :none, :right)
Другие расширения