1. Базовый оператор присваивания =
Сохраняет значение выражения справа в переменную слева, перезаписывая старое значение.
Синтаксис:
переменная = значение или выражение;
int age;
age = 10; // Присвоить переменной age число 10
String name;
name= "sam"; // Присвоение строкиCode language: JavaScript (javascript)
2. Оператор присваивания с проверкой на null ??=
Присвоение выполняется только тогда, когда значение левой переменной равно null. Если переменная не null — исходное значение сохраняется.
Синтаксис:
переменная ??= значение;
Эквивалентно коду:
if (переменная == null) {
переменная = значение;
}Code language: JavaScript (javascript)
Пример:
void main() {
int? total = null;
total ??= 5;
print(total); // Выведет 5, присваивание работает, так как total = null
int? count = 100;
count ??= 200;
print(count); // Выведет 100, переменная не null, изменений нет
}Code language: PHP (php)
3. Составные операторы присваивания
Выполняют математическую операцию и присваивание за одно действие
Для любого оператора op
a op= b равносильно записи a = a op b
| Категория | Оператор | Значение |
|---|---|---|
| Базовая арифметика | += | Сложить и присвоить |
-= | Вычесть и присвоить | |
*= | Умножить и присвоить | |
/= | Деление с плавающей точкой и присвоить | |
| Целочисленное деление | ~/= | Целочисленное деление и присвоить |
| Остаток от деления | %= | Вычислить модуль и присвоить |
| Битовый сдвиг влево | <<= | Сдвинуть биты влево и присвоить |
| Битовый сдвиг вправо | >>= | Сдвинуть биты вправо и присвоить |
| Беззнаковый сдвиг вправо | >>>= | Беззнаковый сдвиг вправо и присвоить |
| Побитовое И | &= | Побитовое И и присвоить |
| Побитовое XOR | ^= | Побитовое XOR и присвоить |
| Побитовое ИЛИ | |= | Побитовое ИЛИ и присвоить |
| Общий принцип работы: | a op= b | a = a op b |
| Пример: | a += b | a = a + b |
Код примера:
void main() {
var num = 2;
// *= Составное присваивание умножения
num *= 3;
print(num); // 6, эквивалентно num = num * 3
// += Сложение
num += 4;
print(num); // 10, эквивалентно num = num + 4
// -= Вычитание
num -= 2;
print(num); // 8
// /= Деление с плавающей точкой
double d = 10;
d /= 2;
print(d); // 5.0
// ~/= Целочисленное деление
int n = 7;
n ~/= 2;
print(n); // 3
// %= Модуль
int m = 9;
m %= 2;
print(m); // 1
// <<= Сдвиг влево
int bit1 = 1;
bit1 <<= 2; // 1 << 2 = 4
print(bit1); // 4
// >>= Сдвиг вправо
int bit2 = 8;
bit2 >>= 2; // 8 >> 2 = 2
print(bit2); // 2
// >>>= Беззнаковый сдвиг вправо
int bit3 = -8;
bit3 >>>= 2;
print(bit3); //4611686018427387902, очень большое число
// &= Побитовое И
int x = 6; // 110
x &= 3; // 011
print(x); // 010 = 2
// ^= Побитовое XOR
int y = 5;
y ^= 3;
print(y);
// |= Побитовое ИЛИ
int z = 4;
z |= 1;
print(z); // 5
}Code language: PHP (php)
Про битовые сдвиги: переменная int bit1 = 1; сдвигаем биты на 2 позиции влево,
32-битное двоичное представление десятичного числа 1:
00000000 00000000 00000000 00000001
x << n: Сдвигаем все двоичные биты числа x на n позиций влево, пустые младшие разряды справа заполняем нулями, а биты, вышедшие за пределы слева — отбрасываем.
В нашем примере получается такая последовательность:
00000000 00000000 00000000 00000100
Это двоичное значение соответствует десятичному числу 4
Логические операторы мы разберем позже. Сейчас достаточно освоить операторы присваивания — это основная тема данного урока.
void main() {
// 1. Базовое присваивание =
var a = 2;
print(a == 2);
// 2. Составное умножение *=
a *= 3; // a = a * 3;
print(a == 6);
// 3. Составное сложение +=
a += 4; // a = a + 4;
print(a == 10);
// 4. Присваивание с проверкой на null ??=
int? b; // По умолчанию null
b ??= 20;
print(b == 20);
b ??= 99; // b не равен null, изменений нет
print(b == 20);
// 5. Вычитание -=
a -= 5;
print(a == 5);
// 6. Модуль %=
a %= 3;
print(a == 2);
}Code language: Dart (dart)
Все выводимые значения равны true