Перейти к содержимому

Операторы в Rust

Операторы — это символы, с помощью которых считают, сравнивают значения и объединяют условия. Если ты писал на любом C-подобном языке, большинство из них покажутся знакомыми.

fn main() {
let a = 10;
let b = 3;
println!("{}", a + b); // 13
println!("{}", a - b); // 7
println!("{}", a * b); // 30
println!("{}", a / b); // 3 (целочисленное деление, остаток отбрасывается)
println!("{}", a % b); // 1 (остаток)
}
▶ Попробуй сам

Они сравнивают два значения и возвращают bool:

fn main() {
let a = 5;
let b = 8;
println!("{}", a == b); // false
println!("{}", a != b); // true
println!("{}", a < b); // true
println!("{}", a > b); // false
println!("{}", a <= b); // true
println!("{}", a >= b); // false
}

Ты будешь постоянно использовать их в условиях if, о которых рассказывает урок If…Else.

Логические операторы объединяют или инвертируют логические значения:

fn main() {
let is_logged_in = true;
let is_admin = false;
println!("{}", is_logged_in && is_admin); // false — оба должны быть true
println!("{}", is_logged_in || is_admin); // true — хотя бы одно true
println!("{}", !is_admin); // true — меняет false на true
}
▶ Попробуй сам
  • && — и: true, только если обе стороны true.
  • || — или: true, если хотя бы одна сторона true.
  • ! — не: меняет true на false и наоборот.

Кроме обычного =, в Rust есть сокращённые операторы, которые обновляют переменную на основе её текущего значения:

fn main() {
let mut score = 10;
score += 5; // то же, что score = score + 5
score -= 2; // score = score - 2
score *= 3; // score = score * 3
score /= 2; // score = score / 2
println!("{score}");
}
▶ Попробуй сам

Помни: чтобы всё это скомпилировалось, переменной нужен mut — ты ведь меняешь её значение.

Когда в выражении несколько операторов, Rust не идёт просто слева направо. Как в школьной математике, *, / и % выполняются раньше + и -. Операторы одного уровня выполняются слева направо. Скобки всегда идут первыми, так что ставь их, когда нужен другой порядок.

fn main() {
let a = 2 + 3 * 4; // сначала *: 2 + 12
let b = (2 + 3) * 4; // сначала скобки: 5 * 4
let c = 10 - 4 - 3; // один уровень, слева направо: (10 - 4) - 3
let d = 17 % 5 * 2; // один уровень, слева направо: (17 % 5) * 2
let ok = 1 + 1 == 2 && 3 > 2; // арифметика, потом сравнения, потом &&
println!("{a} {b} {c} {d} {ok}");
}

Вывод:

14 20 3 4 true
▶ Попробуй сам

Полный порядок, от первого к последнему, примерно такой: арифметика (* / %, затем + -), потом сравнения (== != < > <= >=), потом &&, потом || и в самом конце операторы присваивания (= += -= и компания). Поэтому 1 + 1 == 2 && 3 > 2 работает без всяких скобок. И всё же, если тебе приходится останавливаться и вспоминать порядок, поставь скобки. Они ничего не стоят, а код становится понятнее.

Видео длится 125 секунд. Сохрани это число в переменной, а затем выведи, сколько это целых минут и оставшихся секунд, например Длительность: 2 мин 5 с. Подсказка: целочисленное деление / даёт целые минуты, а % — то, что осталось.

Показать решение
fn main() {
let total_seconds = 125;
let minutes = total_seconds / 60; // 2 (остаток отбрасывается)
let seconds = total_seconds % 60; // 5 (остаток)
println!("Длительность: {minutes} мин {seconds} с");
}

Вывод:

Длительность: 2 мин 5 с
▶ Попробуй сам

Начни игровой счёт score с 10. Прибавь 25, отними 5, затем удвой его — с помощью сокращённых операторов присваивания. Выведи счёт, набрано ли хотя бы 50 очков, и набрано ли хотя бы 50 и при этом число чётное. Подсказка: число чётное, когда score % 2 == 0.

Показать решение
fn main() {
let mut score = 10;
score += 25; // 35
score -= 5; // 30
score *= 2; // 60
println!("счёт: {score}");
println!("уровень пройден? {}", score >= 50);
println!("пройден и чётный? {}", score >= 50 && score % 2 == 0);
}

Вывод:

счёт: 60
уровень пройден? true
пройден и чётный? true
▶ Попробуй сам
  • Арифметика: + - * / %. Целочисленное деление отбрасывает дробную часть.
  • Сравнение: == != < > <= >=, все возвращают bool.
  • Логика: && (и), || (или), ! (не).
  • Сокращённое присваивание: += -= *= /= обновляют переменную с mut на месте. ++ нет.
  • * / % выполняются раньше + -, а арифметика — раньше сравнений и &&/||. Сомневаешься — ставь скобки.

Проверь себя

1. Чему равно 10 / 3, если обе стороны — целые числа?

2. Какой тип всегда возвращают операторы сравнения вроде == и <?

3. Что нужно, чтобы score += 5; скомпилировалось?

Результат: 0 / 3