Namaran

Code daily. Without assist.

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ではその順序が仕様として保証されています。