KDOC 677: 代入やifが式か文かは言語によって違う
この文書のステータス
- 作成
- 2026-10-17 貴島
- レビュー
- 2026-10-17 貴島
概要
式は値を生成し、文は生成しない。たとえば 5 や 1 + 2 は値になるので式である。
文 (statement) はなんらかの動作をして値を返さない命令です。 式 (expression) は結果値に評価されます。
どの構文が式になるかは、言語によって変わる。
| 言語 | 代入 | 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で確かめた。
関連
なし。