Bird
Raised Fist0
Rustprogramming~5 mins

Expression vs statement in Rust - Performance Comparison

Choose your learning style10 modes available
Time Complexity: Expression vs statement
O(n)
Understanding Time Complexity

We want to understand how the time it takes to run code changes when using expressions versus statements in Rust.

Which parts of the code repeat work and how does that affect speed?

Scenario Under Consideration

Analyze the time complexity of the following code snippet.


fn main() {
    let mut sum = 0;
    for i in 1..=5 {
        sum += i; // statement
    }
    let result = { 1 + 2 + 3 + 4 + 5 }; // expression
    println!("Sum: {}, Result: {}", sum, result);
}
    

This code adds numbers using a loop (a statement) and also calculates a sum using an expression block.

Identify Repeating Operations

Identify the loops, recursion, array traversals that repeat.

  • Primary operation: The for loop runs 5 times, adding numbers one by one.
  • How many times: The loop repeats 5 times; the expression runs once.
How Execution Grows With Input

As the number of items to add grows, the loop runs more times, but the expression runs once regardless.

Input Size (n)Approx. Operations
55 additions in loop, 1 expression evaluation
1010 additions in loop, 1 expression evaluation
100100 additions in loop, 1 expression evaluation

Pattern observation: The loop's work grows with input size, but the expression's work stays the same.

Final Time Complexity

Time Complexity: O(n)

This means the time grows directly with the number of loop steps; expressions that run once don't add to growth.

Common Mistake

[X] Wrong: "Expressions always take more time than statements because they look complex."

[OK] Correct: Expressions can run once and be simple, while statements like loops repeat work many times, taking more time as input grows.

Interview Connect

Understanding how expressions and statements affect time helps you explain code efficiency clearly and confidently in interviews.

Self-Check

"What if we replaced the fixed loop range with a user input number n? How would the time complexity change?"

Practice

(1/5)
1. In Rust, which of the following best describes an expression?
easy
A. It calculates a value and returns it.
B. It performs an action but does not return a value.
C. It is used only for declaring variables.
D. It is a comment explaining the code.

Solution

  1. Step 1: Understand what an expression does

    An expression in Rust always produces a value when evaluated.
  2. Step 2: Compare with statements

    Statements perform actions but do not return values, unlike expressions.
  3. Final Answer:

    It calculates a value and returns it. -> Option A
  4. Quick Check:

    Expression = returns value [OK]
Hint: Expressions always produce values; statements do not [OK]
Common Mistakes:
  • Confusing statements with expressions
  • Thinking expressions do not return values
  • Assuming all code lines are statements
2. Which of the following is a valid Rust statement?
easy
A. let x = 5;
B. 5 + 3
C. x * 2
D. println!("Hello")

Solution

  1. Step 1: Identify statements vs expressions

    Statements perform actions and often end with a semicolon, like variable declarations.
  2. Step 2: Check each option

    let x = 5; declares a variable and ends with a semicolon, so it's a statement. Options A and C are expressions without semicolons. println!("Hello") is a macro call but without a semicolon, so it's an expression.
  3. Final Answer:

    let x = 5; -> Option A
  4. Quick Check:

    Statements end with semicolon [OK]
Hint: Statements usually end with semicolons [OK]
Common Mistakes:
  • Missing semicolon for statements
  • Confusing macro calls without semicolon as statements
  • Thinking expressions are statements
3. What is the output of this Rust code?
fn main() {
    let x = 3;
    let y = {
        let z = x + 2;
        z * 2
    };
    println!("{}", y);
}
medium
A. 8
B. 10
C. 7
D. Compilation error

Solution

  1. Step 1: Evaluate the inner block expression

    Inside the block, z = x + 2 = 3 + 2 = 5, then the block returns z * 2 = 5 * 2 = 10.
  2. Step 2: Assign and print the value

    Variable y gets the value 10, which is printed by println!.
  3. Final Answer:

    10 -> Option B
  4. Quick Check:

    Block expression returns 10 [OK]
Hint: Blocks return last expression value without semicolon [OK]
Common Mistakes:
  • Assuming block returns unit () due to semicolon confusion
  • Miscomputing z or y values
  • Thinking println! returns a value
4. Identify the error in this Rust code snippet:
fn main() {
    let x = 5;
    let y = if x > 3 {
        x + 1;
    } else {
        x - 1
    };
    println!("{}", y);
}
medium
A. Variable x is not initialized
B. Missing semicolon after if expression
C. The if block returns unit type, causing a type mismatch
D. println! macro is used incorrectly

Solution

  1. Step 1: Analyze the if expression branches

    The if branch has x + 1; with a semicolon, making it a statement returning unit (). The else branch returns x - 1 without semicolon, an expression returning i32.
  2. Step 2: Understand type mismatch

    Because branches return different types (unit vs i32), Rust reports a type mismatch error for y.
  3. Final Answer:

    The if block returns unit type, causing a type mismatch -> Option C
  4. Quick Check:

    If branches must return same type [OK]
Hint: Remove semicolon in if branch to return value [OK]
Common Mistakes:
  • Adding semicolon after expressions in if branches
  • Ignoring type mismatch errors
  • Assuming println! causes error
5. You want to assign a variable result to the value of a block that adds 2 to n only if n is positive, otherwise returns 0. Which code correctly uses expressions and statements?
hard
A. let result = if n > 0 { n + 2 } else { 0 };
B. let result = if n > 0 { n + 2; } else { 0; };
C. let result = if n > 0 { n + 2 } else { println!("Zero") };
D. let result = { if n > 0 { n + 2 } else { 0 } };

Solution

  1. Step 1: Check if expressions return values

    Options A and D both return values correctly. let result = if n > 0 { n + 2; } else { 0; }; has semicolons inside if branches, making them statements returning unit (). let result = if n > 0 { n + 2 } else { println!("Zero") };'s else branch calls println! which returns unit (), causing type mismatch.
  2. Step 2: Compare A and D

    let result = if n > 0 { n + 2 } else { 0 }; assigns directly from if expression. let result = { if n > 0 { n + 2 } else { 0 } }; wraps the if expression inside a block, which is also an expression returning the if's value. Both are valid, but let result = { if n > 0 { n + 2 } else { 0 } }; explicitly shows block expression usage.
  3. Final Answer:

    let result = { if n > 0 { n + 2 } else { 0 } }; -> Option D
  4. Quick Check:

    Block expression returns if expression value [OK]
Hint: Use blocks or if expressions without semicolons for values [OK]
Common Mistakes:
  • Adding semicolons inside if branches
  • Mixing expressions with statements causing type errors
  • Using println! where a value is expected
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard