跳转至

表达式

与 C++ 中不一样的是,在 lumos 中如果表达式是一个右值,则不能取地址。
常量表达式必为右值,故不能取地址。

var my_var = 10;
expression expr1 = my_var; // 左值
val a = &expr1; // 通过编译
expression expr2 = 10;     // 右值
val b = &expr2; // 错误
constexpr expr3 = 10;      // 右值
val c = &expr3; // 错误

表达式 expression

expression 用于声明一个表达式,其值在运行时确定,可以作为宏的替代。
以下两种写法在使用 int b = expr * 2; 时等效,均展开为 int b = (a + 10) * 2;

#define expr (a + 10)
expression expr = a + 10;

表达式也可以是可求值代码块:

expression expr = val {
    int x = a + 10;
    x * 2;
};

表达式拥有作用域,无需像宏那样担心重复定义的问题。

{
    expression expr = a + 10;
    int b = expr * 2;
} // expr 超出作用域,不再可用

{
#define expr (a + 10)
    int b = expr * 2;
#undef expr // 需要手动取消定义
}

表达式可以在作用域内重新定义,不会影响外部作用域。

expression expr = a + 10;
{
    expression expr = a + 20;
    int b = expr * 2; // b = (a + 20) * 2
}
int b = expr * 2; // b = (a + 10) * 2

常量表达式 constexpr

constexpr 用于声明一个常量表达式,其值在编译时确定。

constexpr expr = 10 + 1;

其余用法与表达式相同。