Bird
Raised Fist0
Rustprogramming~5 mins

Expression vs statement in Rust

Choose your learning style10 modes available
Introduction

Expressions and statements are the building blocks of Rust code. Knowing the difference helps you write clear and correct programs.

When you want to calculate a value and use it immediately.
When you want to perform an action like assigning a value or printing something.
When you need to decide if a piece of code returns a value or just does something.
When writing functions that return values versus those that just perform tasks.
When you want to chain operations or use the result of a calculation.
Syntax
Rust
expression;
statement;

An expression produces a value.

A statement performs an action but does not return a value.

Examples
This is a statement that assigns the result of the expression 5 + 3 to x.
Rust
let x = 5 + 3;
This is an expression that calculates the sum of 5 and 3 and returns 8.
Rust
5 + 3
The block is an expression that returns 5. The last line a + 3 is an expression without a semicolon, so it returns a value.
Rust
let y = {
    let a = 2;
    a + 3
};
This is a statement that prints text but does not return a value.
Rust
println!("Hello");
Sample Program

This program shows statements like variable declarations and printing. It also shows expressions like x + y and the block that returns a * b. The block's last line is an expression without a semicolon, so it returns a value assigned to result.

Rust
fn main() {
    let x = 10; // statement: declares and assigns
    let y = 20; // statement

    let sum = x + y; // expression (x + y) inside a statement

    println!("Sum is: {}", sum); // statement

    let result = {
        let a = 5;
        let b = 6;
        a * b // expression without semicolon returns value
    };

    println!("Result is: {}", result); // statement
}
OutputSuccess
Important Notes

In Rust, almost everything is an expression except for a few things like let statements.

Expressions can be part of statements, but statements do not return values.

Remember: expressions can be used wherever a value is expected.

Summary

Expressions calculate and return values.

Statements perform actions but do not return values.

Understanding this helps you write better Rust code.

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