KDOC 677: 代入やifが式か文かは言語によって違う

この文書のステータス

  • 作成
    • 2026-10-17 貴島
  • レビュー
    • 2026-10-17 貴島

概要

式は値を生成し、文は生成しない。たとえば 5 や 1 + 2 は値になるので式である。

文 (statement) はなんらかの動作をして値を返さない命令です。 式 (expression) は結果値に評価されます。

関数 - The Rust Programming Language 日本語版

どの構文が式になるかは、言語によって変わる。

言語 代入 if
C 式 文
Rust 式(値は () )。 let は文 式
Ruby 式 式

Cの代入は、代入後の値を返す式である。 if は文なので、値として使えない(N1570 6.5.16、6.8.4)。

int x, y;
x = y = 6;
printf("%d %d\n", x, y);
6 6

int z = if (1) 1; else 2; のように if を値として使うと、 expected expression before 'if' というコンパイルエラーになる。

Rustの代入は式だが、値は常に () になる(The Rust Reference: Assignment expressions)。 let は文なので値にならない。 let x = (let y = 6); は expected expression, found `let` statement というコンパイルエラーになる。

if は式なので let の右辺に書ける(制御フロー - The Rust Programming Language 日本語版)。

fn main() {
    let z = if true { 1 } else { 2 };
    println!("{z}");
}
1

Rubyの代入は代入した値を返し、 if などの制御構造も値を返す(assignment、control expressions)。

x = y = 6
p [x, y]
z = if true then 1 else 2 end
p z
[6, 6]
1

gcc 13.3.0、rustc 1.97.1、ruby 3.4.9で確かめた。

関連

なし。