Rust Operators

Rust groups its operators into arithmetic, comparison, and logical families, each with strict rules about the types they accept.

#Jobseeker

Find matching jobs & Auto apply with AI

Hyring
Jobseeker using Hyring to search, apply, and prepare with AI

Arithmetic Operators

Rust supports the standard set of arithmetic operators: `+`, `-`, `*`, `/`, and `%` for remainder. Both operands of an arithmetic operator must be the same numeric type -- Rust will not silently convert an `i32` to an `f64` for you.

Arithmetic Basics

fn main() {
    let sum = 10 + 4;
    let difference = 10 - 4;
    let product = 10 * 4;
    let quotient = 10 / 4;
    let remainder = 10 % 4;

    println!("{} {} {} {} {}", sum, difference, product, quotient, remainder);
}

Integer Division Truncates

When both operands of `/` are integers, the result is an integer too -- the fractional part is discarded, not rounded. `10 / 4` gives `2`, not `2.5`. If you need a fractional answer, at least one operand must be a floating-point type.

Note: Dividing by zero with integers panics at runtime ("attempt to divide by zero"), while dividing a float by zero produces `inf`, `-inf`, or `NaN` instead of crashing. The two types behave very differently at this edge case.

Comparison Operators

Comparison operators -- `==`, `!=`, `<`, `>`, `<=`, `>=` -- compare two values of the same type and always produce a `bool`. There's no implicit truthiness in Rust; you can't compare an integer to a boolean, or use an integer directly where a `bool` is expected.

Comparisons

fn main() {
    let a = 7;
    let b = 12;

    println!("{} == {}: {}", a, b, a == b);
    println!("{} < {}: {}", a, b, a < b);
    println!("{} != {}: {}", a, b, a != b);
}

Logical Operators

The logical operators `&&` (and), `||` (or), and `!` (not) work exclusively on `bool` values. Both `&&` and `||` short-circuit: if the left side of `&&` is `false`, or the left side of `||` is `true`, Rust never evaluates the right side at all.

Logical Operators and Short-Circuiting

fn main() {
    let age = 20;
    let has_id = true;

    let can_enter = age >= 18 && has_id;
    let needs_review = age < 18 || !has_id;

    println!("Can enter: {}", can_enter);
    println!("Needs review: {}", needs_review);
}
  • Arithmetic operators require matching numeric types on both sides
  • Comparison operators always return `bool`, never an integer
  • `&&` and `||` short-circuit -- the right side may never run
  • Compound assignment operators like `+=`, `-=`, `*=` combine an operator with assignment
OperatorCategoryExampleResult
%Arithmetic10 % 31
==Comparison5 == 5true
&&Logicaltrue && falsefalse
!Logical!truefalse
Note: Short-circuiting isn't just an optimization -- it's often relied on for safety, like writing `index < list.len() && list[index] == target` so the index access never happens when it would be out of bounds.

Exercise: Rust Operators

Does Rust support the ++ increment operator?