Bird
Raised Fist0
Rustprogramming~20 mins

Expression vs statement in Rust - Practice Questions

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
Rust Expression Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ Predict Output
intermediate
2:00remaining
What is the output of this Rust code snippet?

Consider the following Rust code. What will it print?

Rust
fn main() {
    let x = 5;
    let y = {
        let z = x + 1;
        z * 2
    };
    println!("{}", y);
}
A10
B12
C11
DError: missing semicolon
Attempts:
2 left
💡 Hint

Remember that blocks in Rust can be expressions returning the last value without a semicolon.

🧠 Conceptual
intermediate
1:30remaining
Which of these is a statement in Rust?

Identify which option is a statement rather than an expression.

Alet x = 10;
B"hello".len()
C5 + 3
Dx * 2
Attempts:
2 left
💡 Hint

Statements perform actions but do not return values.

🔧 Debug
advanced
2:30remaining
Why does this Rust code fail to compile?

Examine the code and select the reason for the compilation error.

Rust
fn main() {
    let x = 5;
    let y = if x > 3 {
        x + 1;
    } else {
        x - 1
    };
    println!("{}", y);
}
ANo error, prints 6
BError: missing else branch
CError: x is not mutable
DError: mismatched types because if branches return () due to semicolon
Attempts:
2 left
💡 Hint

Check the effect of semicolons on expressions inside if blocks.

📝 Syntax
advanced
2:00remaining
Which option correctly uses an expression to assign a value in Rust?

Choose the correct Rust code that assigns y using an expression block.

Alet y = { let a = 3; a + 4; };
Blet y = { let a = 3; println!("{}", a + 4) };
Clet y = { let a = 3; a + 4 };
Dlet y = { let a = 3; return a + 4; };
Attempts:
2 left
💡 Hint

Remember that the last expression in a block without a semicolon is the block's value.

🚀 Application
expert
3:00remaining
What is the value of variable z after running this Rust code?

Analyze the code and determine the final value of z.

Rust
fn main() {
    let x = 2;
    let y = {
        let a = x * 3;
        a + 1
    };
    let z = if y > 6 {
        y * 2
    } else {
        y / 2
    };
    println!("{}", z);
}
A14
B7
C6
DError: mismatched types
Attempts:
2 left
💡 Hint

Calculate step-by-step: block value, then if condition, then final assignment.

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