Expression and Statement

表達式 (Expression) 和陳述式 (Statement) 的差別在於, 前者為一種值 (value),後者不代表任何運行結果,範例如下:

a = sin(pi);

先不管是什麼程式語言,上面的意思假設是「用 pi 參數呼叫 sin 函式,將結果存入 a 名稱中」, 那 pisin(pi) 是一種表達式,而 a = sin(pi) 是一種陳述式。

單純的陳述式例如模組導入:

from sys import exit

然而如 C/C++ 的指派 (assignment) 式有表達式的功能,指派的同時代表右值。

if (i = true)
    always_go();

原本 Python 的指派式並非表達式,但是 Python 3.8 新增的 assignment expression (PEP 572) 讓指派也有代表右值的功能。

if i := True:
    always_go()

另外 C/C++ 的逗號運算子 (comma operator) 代表最後項的值。 不過這個運算子優先權太低,導致必須用括弧提昇優先權,酷似函式呼叫容易搞混,因此不常用。

int will_be_10 = (first(), second(), 10);

類似的特性被 Rust 引用,任何 code block 都是表達式(代表末尾值,加分號 ; 成為陳述式);反而使用 return 關鍵字為陳述式,必須加分號。


#![allow(unused)]
fn main() {
/// code block 可以不寫 return
fn my_function(condition: bool) -> u8 {
    if condition {
        // Statement
        return 10;
    } else {
        // Expression
        20
    }
}

let a = if {
    let b = true;
    b
} {
    10
} else {
    20
};
}

JavaScript 的函式也是很經典的例子,總共有三種函式寫法:

/// 這邊只是示範,const 變數不可以重複指派
// 函式陳述式(不用結尾分號)
function f() {}
// 函式表達式
const f = function () {};
// 無 this 的箭號函式 (arrow function)
const f = () => {};
// 異步函式的版本
async function f() {}
const f = async function () {};
const f = async () => {};
// 無指派,執行後回收函式本體
(function () {})();