Expressions and statements are the building blocks of Rust code. Knowing the difference helps you write clear and correct programs.
Expression vs statement in Rust
expression; statement;
An expression produces a value.
A statement performs an action but does not return a value.
5 + 3 to x.let x = 5 + 3;
5 + 3
5. The last line a + 3 is an expression without a semicolon, so it returns a value.let y = {
let a = 2;
a + 3
};println!("Hello");
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.
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
}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.
Expressions calculate and return values.
Statements perform actions but do not return values.
Understanding this helps you write better Rust code.
Practice
expression?Solution
Step 1: Understand what an expression does
An expression in Rust always produces a value when evaluated.Step 2: Compare with statements
Statements perform actions but do not return values, unlike expressions.Final Answer:
It calculates a value and returns it. -> Option AQuick Check:
Expression = returns value [OK]
- Confusing statements with expressions
- Thinking expressions do not return values
- Assuming all code lines are statements
Solution
Step 1: Identify statements vs expressions
Statements perform actions and often end with a semicolon, like variable declarations.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.Final Answer:
let x = 5; -> Option AQuick Check:
Statements end with semicolon [OK]
- Missing semicolon for statements
- Confusing macro calls without semicolon as statements
- Thinking expressions are statements
fn main() {
let x = 3;
let y = {
let z = x + 2;
z * 2
};
println!("{}", y);
}Solution
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.Step 2: Assign and print the value
Variable y gets the value 10, which is printed by println!.Final Answer:
10 -> Option BQuick Check:
Block expression returns 10 [OK]
- Assuming block returns unit () due to semicolon confusion
- Miscomputing z or y values
- Thinking println! returns a value
fn main() {
let x = 5;
let y = if x > 3 {
x + 1;
} else {
x - 1
};
println!("{}", y);
}Solution
Step 1: Analyze the if expression branches
The if branch hasx + 1;with a semicolon, making it a statement returning unit (). The else branch returnsx - 1without semicolon, an expression returning i32.Step 2: Understand type mismatch
Because branches return different types (unit vs i32), Rust reports a type mismatch error for y.Final Answer:
The if block returns unit type, causing a type mismatch -> Option CQuick Check:
If branches must return same type [OK]
- Adding semicolon after expressions in if branches
- Ignoring type mismatch errors
- Assuming println! causes error
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?Solution
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.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.Final Answer:
let result = { if n > 0 { n + 2 } else { 0 } }; -> Option DQuick Check:
Block expression returns if expression value [OK]
- Adding semicolons inside if branches
- Mixing expressions with statements causing type errors
- Using println! where a value is expected
Ready to prove it?
Pass the test and this pattern moves unknown
