Арифметические операции
// Copyright 2023 Google LLC
// SPDX-License-Identifier: Apache-2.0
fn interproduct(a: i32, b: i32, c: i32) -> i32 {
return a * b + b * c + c * a;
}
fn main() {
println!("result: {}", interproduct(120, 100, 248));
}
Это первая функция, отличная от main, которую мы видим, но смысл должен быть понятен: она принимает три целых числа и возвращает целое число. Функции будут рассмотрены подробнее позже.
Арифметика очень похожа на другие языки, с похожим приоритетом операций.
А что насчёт переполнения целых чисел? В C и C++ переполнение знаковых целых на самом деле не определено и может привести к непредсказуемому поведению во время выполнения. В Rust оно определено.
Замените i32 на i16, чтобы увидеть целочисленное переполнение: в отладочной сборке оно вызывает панику (checked), а в релизной — выполняет обёртывание (wrapping). Есть и другие варианты: overflowing, saturating, carrying. Они доступны через синтаксис методов, например (a * b).saturating_add(b * c).saturating_add(c * a).
На самом деле компилятор обнаруживает переполнение константных выражений, поэтому в примере используется отдельная функция.