2026-09-16
arg_order.rs
fn combine(a: i32, b: i32) -> i32 {
a * 10 + b
}
fn main() {
let mut counter = 0;
let mut next = || {
counter += 1;
counter
};
let result = combine(next(), next());
println!("{result}");
}
combineの実引数として渡した2つのnext()呼び出しに注目してください。これは何を出力するでしょうか?
Answer
12(その後に改行)。Rustは関数呼び出しの実引数(実際に書かれた式)を、左から右へ順に評価すると仕様で規定しています。したがって1回目のnext()が先に走ってcounterを1にした値が仮引数aに、2回目がcounterを2にした値が仮引数bに束縛されます。combine(1, 2)は1 * 10 + 2 = 12です。Cでは実引数の評価順序は未規定で、同じような副作用のあるコードを書いても結果は処理系任せですが、Rustではその順序が仕様として保証されています。