Операторы бывают следующих типов:
+ Сложение – Вычитание -expr Отрицание переменной expr * Умножение / Деление ~/ Целочисленный результат деления % Остаток от деления
Также есть сокращённые операторы сложения и вычитания:
var++; // var = var + 1 ++var; // var = var + 1 var--; // var = var - 1 --var; // var = var - 1 print ( var++ ); // var print ( ++var ); // var + 1 print ( var-- ); // var print ( --var ); // var - 1
Рассмотрим последовательность выполнения операций на примере:
int a = 1; int b = 5; int c = 12; int d = 15; print ( 'a++ / 4 + --b ~/ 3 - ( ++c % ( 5 - 2 ) + d-- * ( 3 + 5 ) ) + d = ?' ); // Сначала выполняются все операции в скобках, всё как в обычной математике - слева направо, если внутри скобки есть другая скобка - выполняется сначала внутренняя print ( '( 5 - 2 ) = ${( 5 - 2 )}' ); // 3 print ( '( 3 + 5 ) = ${( 3 + 5 )}' ); // 8 // Наивысший приоритет у постфиксный операций var++ и var-- // Затем выполняются префиксные ++var и --var // Далее идут операции * , / , % и ~/ // И в последнюю очередь + и - print ( 'd-- = ${d--}' ); // 15 (не смотря на то, что d уже теперь 14, в самой операции используется значение 15) print ( '++c = ${++c}' ); // 13 print ( '++c % ( 5 - 2 ) = ${++c % ( 5 - 2 )}' ); // 1 print ( 'd-- * ( 3 + 5 ) = ${d-- * ( 3 + 5 )}' ); // 120 (в этом примере становится более очевидным что d-- используется как 15) print ( '( ++c % ( 5 - 2 ) + d-- * ( 3 + 5 ) ) = ${( ++c % ( 5 - 2 ) + d-- * ( 3 + 5 ) )}' ); // 121 print ( 'a++ = ${a++}' ); // 1 print ( '--b = ${--b}' ); // 4 print ( 'a++ / 4 = ${a++ / 4}' ); // 0.25 print ( '--b ~/ 3 = ${--b ~/ 3}' ); // 1 print ( 'a++ / 4 + --b ~/ 3 = ${a++ / 4 + --b ~/ 3}' ); // 1.25 print ( 'a++ / 4 + --b ~/ 3 - ( ++c % ( 5 - 2 ) + d-- * ( 3 + 5 ) ) = ${a++ / 4 + --b ~/ 3 - ( ++c % ( 5 - 2 ) + d-- * ( 3 + 5 ) )}' ); // -119.75 print ( 'a++ / 4 + --b ~/ 3 - ( ++c % ( 5 - 2 ) + d-- * ( 3 + 5 ) ) + d = ${a++ / 4 + --b ~/ 3 - ( ++c % ( 5 - 2 ) + d-- * ( 3 + 5 ) ) + d}' ); // -105.75 (на момент последней операции d = 14)
== Равно != Не равно > Больше < Меньше >= Больше или равно <= Меньше или равно
as Приведение к типу is Истина, если тип совпадает is! Ложь, если тип совпадает
= –= /= %= >>= ^= += *= ~/= <<= &= |=
Например,
a = 5; a += 6; // a = a + 6 a ??= 7; // a = ( a == null ? 7 : a );
!expr Отрицание выражения || логическое ИЛИ && логическое И & И | ИЛИ ^ Исключающее ИЛИ
Между операциями | и || (и такой же парой & || &&) есть существенная разница несмотря на то, что выполняют единую логику.
Операторы | и || (ИЛИ) должен дать ответ ИСТИНА если хотя бы одно из условий ИСТИНА, но оператор | выполнится только после приведения всех условий в окончательный вид, а II будет проверять условия по очереди. Пример:
int a = 1; print ( true | ( ++a == 2 ) ); print ( a ); // 2, так как ++a код выполнился print ( true || ( ++a == 2 ) ); print ( a ); // 2, не изменилось, так как из-за значения ИСТИНА первого условия, второе условие не выполнялось print ( false || ( ++a == 2 ) ); print ( a ); // 3, изменилось так как пришлось вычислять второе условие из-за ЛОЖНОГО первого
~expr Побитовое дополнение (0 в 1, 1 в 0) << Сдвиг влево >> Сдвиг вправо
expr = condition ? expr1 : expr2; // if ( condition ) { expr = expr1; } else { expr = expr2; } expr = expr1 ?? expr2; // if ( expr1 != null ) { expr = expr1; } else { expr = expr2; }
В примерах:
// Условные операторы и проверка типов print ( 'Hello, world!' is String ); // true print ( 'Hello, world!' is int ); // false print ( 'Hello, world!' is! int ); // true var isGuest = false; var userGroup = isGuest ? 'guest' : 'user'; print ( userGroup ); // user var username; String getUserName ( String username ) => username ?? 'Guest'; print ( getUserName ( username ) ); // Guest var valueNull; var valueNotNull = 0; var valueInt = 12; valueNull ??= valueInt; // обозначает присвоить значение, если изначально NULL print ( valueNull ); // 12 valueNotNull ??= valueInt; print ( valueNotNull ); // 0 // Каскадный оператор querySelector ( '#alert' ) ..text = 'Warning' ..classes.add('danger') ..onClick.listen((e) => window.alert('ERROR!')); // Его аналог в классическом виде var button = querySelector ( '#alert' ); button.text = 'Warning'; button.classes.add('danger'); button.onClick.listen((e) => window.alert('ERROR!'));