表达式¶
与 C++ 中不一样的是,在 Lumos 中如果表达式是一个右值,则不能取地址。
常量表达式必为右值,故不能取地址。
var myvar = 10; // 变量
let expr1 = myvar; // 左值
val a = &expr1; // 通过编译
let expr2 = 10; // 右值
val b = &expr2; // 错误
lit expr3 = 10; // 右值
val c = &expr3; // 错误
表达式定义 let
¶
let
用于声明一个表达式,其值在运行时确定,可以作为宏的替代。
以下两种写法在使用 int b = expr * 2;
时等效,均展开为 int b = (a + 10) * 2;
。
#define expr (a + 10)
let expr = a + 10;
表达式也可以是可求值代码块:
let expr = val {
int x = a + 10;
x * 2;
};
表达式可以指定其类型(对其进行强制转换):
let float expr = a + 10;
// 等效于
let expr = float(a + 10);
表达式拥有作用域,无需像宏那样担心重复定义的问题。
{
let expr = a + 10;
int b = expr * 2;
} // expr 超出作用域,不再可用
{
#define expr (a + 10)
int b = expr * 2;
#undef expr // 宏需要手动取消定义
}
表达式可以在作用域内重新定义,不会影响外部作用域。
let expr = a + 10;
{
let expr = a + 20;
int b = expr * 2; // b = (a + 20) * 2
}
int b = expr * 2; // b = (a + 10) * 2
常量表达式定义 lit
¶
lit
用于声明一个常量表达式,性质类似一个字面量,其值在编译时确定。
lit expr = 10 + 1;
// 之后使用 expr 与使用字面量 11 等效
int a[expr];
int b[11];
// a 与 b 的大小完全相同
返回常量表达式的函数¶
fn lit my_add(int a, int b) {
return a + b;
}
这里的参数可以省略 lit
关键字,其必须为常量表达式。
其余用法与普通表达式相同。
明显不能出现指向表达式的指针 let*