字面值表达式

语法
字面值表达式 :
      字符字面值
   | 字符串字面值
   | 原始字符串字面值
   | 字节字面值
   | 字节字符串字面值
   | 原始字节字符串字面值
   | 整数字面值
   | 浮点数字面值
   | true | false

字面值表达式 仅由一个单独的 token 组成,其直接指示计算结果值,而不是通过名称或其他计算规则的间接引用。

字面值是 常量表达式 的其中一种形式,因此在编译时计算 (主要) 。

先前描述的词法 字面值 每种形式都可以形成字面值表达式,关键字 truefalse 也可以。

#![allow(unused)]
fn main() {
"hello";   // 字符串类型
'5';       // 字符类型
5;         // 整数类型
}

字符字面量表达式

字符字面量表达式由一个 字符字面值 token 构成。

注意: 此部分内容不完整。

字符串字面量表达式

字符串字面量表达式由一个 字符串字面值原始字符串字面值 token 构成。

注意: 此部分内容不完整。

字节字面量表达式

字节字面量表达式由一个 字节字面值 token 牌构成。

注意: 此部分内容不完整。

字节字符串字面量表达式

字节字符串字面量表达式由一个 字节字符串字面值原始字节字符串字面值 token 构成。

注意: 此部分内容不完整。

整型字面值表达式

整型字面值表达式由一个 整数字面值 token 组成。

如果 token 有 后缀 ,则后缀必须是 基本整数类型 中的一个名称: u8i8u16i16u32i32u64i64u128i128usizeisize ,且表达式具有该类型。

如果 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 具有 后缀 ,则后缀必须是 浮点类型 f32f64 之一,且表达式具有该类型。

如果 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_strf64::from_str 处理。

注意: 例如, -1.0 是对字面表达式 1.0 应用 取反运算符 ,而不是单个浮点字面值表达式。

注意: infNaN 不是字面值 token 。 可以使用 f32::INFINITYf64::INFINITYf32::NANf64::NAN 常量来代替字面值表达式。 在 rustc 中,被评估为无限大的字面值将触发 overflowing_literals 代码分析检查。

布尔字面值表达式

布尔字面值表达式由 truefalse 中的一个关键字组成。

该表达式的类型为原始的 布尔类型 ,其值是:

  • 如果关键字是 true,则为真
  • 如果关键字是 false,则为假