字面值表达式
语法
字面值表达式 :
字符字面值
| 字符串字面值
| 原始字符串字面值
| 字节字面值
| 字节字符串字面值
| 原始字节字符串字面值
| 整数字面值
| 浮点数字面值
|true
|false
字面值表达式 仅由一个单独的 token 组成,其直接指示计算结果值,而不是通过名称或其他计算规则的间接引用。
字面值是 常量表达式 的其中一种形式,因此在编译时计算 (主要) 。
先前描述的词法 字面值 每种形式都可以形成字面值表达式,关键字 true
和 false
也可以。
#![allow(unused)] fn main() { "hello"; // 字符串类型 '5'; // 字符类型 5; // 整数类型 }
字符字面量表达式
字符字面量表达式由一个 字符字面值 token 构成。
注意: 此部分内容不完整。
字符串字面量表达式
字符串字面量表达式由一个 字符串字面值 或 原始字符串字面值 token 构成。
注意: 此部分内容不完整。
字节字面量表达式
字节字面量表达式由一个 字节字面值 token 牌构成。
注意: 此部分内容不完整。
字节字符串字面量表达式
字节字符串字面量表达式由一个 字节字符串字面值 或 原始字节字符串字面值 token 构成。
注意: 此部分内容不完整。
整型字面值表达式
整型字面值表达式由一个 整数字面值 token 组成。
如果 token 有 后缀 ,则后缀必须是 基本整数类型 中的一个名称: u8
、 i8
、 u16
、 i16
、 u32
、 i32
、 u64
、 i64
、 u128
、 i128
、 usize
或 isize
,且表达式具有该类型。
如果 token 没有后缀,则该表达式的类型由类型推断确定:
-
如果整型类型可以从周围的程序上下文中确定,则表达式具有该类型。
-
如果程序上下文中的整型类型不足以确定类型,则默认为有符号的 32 位整型
i32
。 -
如果程序上下文中的整型类型过多,则被视为静态类型错误。
整型字面量表达式的例子:
#![allow(unused)] fn main() { 123; // type i32 123i32; // type i32 123u32; // type u32 123_u32; // type u32 let a: u64 = 123; // type u64 0xff; // type i32 0xff_u8; // type u8 0o70; // type i32 0o70_i16; // type i16 0b1111_1111_1001_0000; // type i32 0b1111_1111_1001_0000i64; // type i64 0usize; // type usize }
该表达式的值根据 token 的字符串表示如下确定:
-
通过检查字符串的前两个字符,选择整数基数,如下:
0b
表示基数为 2。0o
表示基数为 8。0x
表示基数为 16。- 否则,基数为 10。
-
如果基数不是 10,则从字符串中删除前两个字符。
-
从字符串中删除任何后缀。
-
从字符串中删除任何下划线。
-
将字符串转换为
u128
值,就像通过u128::from_str_radix
选择的基数一样。如果值不适合u128
,则会出现编译器错误。 -
通过 数字转换 将
u128
值转换为表达式的类型。
注意: 如果该字面值的值超出了该类型的表示范围,最终转换将截断该字面值。
rustc
包括一个名为overflowing_literals
的 [代码分析检查] lint check ,默认为deny
,拒绝其中出现的表达式。
注意: 例如,
-1i8
是对字面值表达式1i8
应用了 取反运算符 ,而不是一个整数字面值表达式。有关表示有符号类型的最大负值的注解,请参见 溢出 。
浮点数字面值表达式
浮点数字面值表达式具有以下两种形式:
如果 token 具有 后缀 ,则后缀必须是 浮点类型 f32
或 f64
之一,且表达式具有该类型。
如果 token 没有后缀,则表达式的类型由类型推断确定:
-
如果可以从周围的程序上下文中 唯一 确定浮点类型,则表达式具有该类型。
-
如果程序上下文不足以确定类型,则默认为
f64
。 -
如果程序上下文类型约束冲突,则被视为静态类型错误。
浮点数字面值表达式的示例:
#![allow(unused)] fn main() { 123.0f64; // type f64 0.1f64; // type f64 0.1f32; // type f32 12E+99_f64; // type f64 5f32; // type f32 let x: f64 = 2.; // type f64 }
表达式的值根据 token 的字符串表示形式确定,具体如下:
- 从字符串中删除任何后缀。
- 从字符串中删除任何下划线。
- 将字符串转换为表达式的类型,如同通过
f32::from_str
或f64::from_str
处理。
注意: 例如,
-1.0
是对字面表达式1.0
应用 取反运算符 ,而不是单个浮点字面值表达式。
注意:
inf
和NaN
不是字面值 token 。 可以使用f32::INFINITY
、f64::INFINITY
、f32::NAN
和f64::NAN
常量来代替字面值表达式。 在rustc
中,被评估为无限大的字面值将触发overflowing_literals
代码分析检查。
布尔字面值表达式
布尔字面值表达式由 true
或 false
中的一个关键字组成。
该表达式的类型为原始的 布尔类型 ,其值是:
- 如果关键字是
true
,则为真 - 如果关键字是
false
,则为假