---
title: 表达式
description: 此页列出了Tact中的所有表达式
---

Tact 中的每个运算符都能构成一个表达式，但 Tact 还提供了更多的表达式选项供您选择。

:::note

  当前允许的最大嵌套级别是 $83$。 试图写入更深的表达式会导致编译错误：

```tact
fun elegantWeaponsForCivilizedAge(): Int {
    return
    ((((((((((((((((((((((((((((((((
        ((((((((((((((((((((((((((((((((
            (((((((((((((((((((( // 84 parens, compilation error!
                42
            ))))))))))))))))))))
        ))))))))))))))))))))))))))))))))
    ))))))))))))))))))))))))))))))));
}
```

:::

## 字面量

字面量表示 Tact 中的值。 这些是固定值，而不是变量，是您在代码中实际提供的。 Tact 中的所有字面量都是表达式本身。

您还可以调用定义在某些 [基元类型][p]上的 [扩展函数](/zh-cn/book/functions#extension-function)，这些 [基元类型][p] 与字面值相对应：

```tact
// Calling toString() defined for Int on a integer literal:
42.toString();

// Calling asComment() defined for String on a string literal:
"Tact is awesome!".asComment();C
```

### 整数字面量 {#integer-literals}

整数字面量可以使用以下表示法编写：[十进制](/zh-cn/book/integers#decimal)（基数 $10$）、[十六进制](/zh-cn/book/integers#hexadecimal)（基数 $16$）、[八进制](/zh-cn/book/integers#octal)（基数 $8$）和[二进制](/zh-cn/book/integers#binary)（基数 $2$）表示法：

- 一个 [_十进制_ 整数](/zh-cn/book/integers#decimal) 字面量是一个数字序列（$\mathrm{0 - 9}$）。

- 一个前导的 $\mathrm{0x}$（或 $\mathrm{0X}$）表示一个 [十六进制整数](/zh-cn/book/integers#hexadecimal) 字面量。 它们可以包括数字（$\mathrm{0 - 9}$）和字母 $\mathrm{a - f}$ 和 $\mathrm{A - F}$。 请注意，字符的大小写不会改变其值。 前导 $\mathrm{0x}$（或 $\mathrm{0X}$）表示[十六进制整数](/zh-cn/book/integers#hexadecimal) 字面量。 它们可以包括数字（$\mathrm{0 - 9}$）和字母 $\mathrm{a - f}$ 和 $\mathrm{A - F}$。 请注意，字符的大小写不会改变其值。 因此：$\mathrm{0xa}$ = $\mathrm{0xA}$ = $10$ 和 $\mathrm{0xf}$ = $\mathrm{0xF}$ = $15$。

- 前导 $\mathrm{0o}$（或 $\mathrm{0O}$）表示 [八进制整数](/zh-cn/book/integers#octal) 字面量。 它们只能包括数字 $\mathrm{0 - 7}$。

- 前导 $\mathrm{0b}$（或 $\mathrm{0B}$）表示 [二进制整数](/zh-cn/book/integers#binary) 字面量。 它们只能包括数字 $0$ 和 $1$。 它们只能包括数字 $0$ 和 $1$。

:::caution
  需要注意的是，在 Tact 中，以 $0$ 为前导的整数字面量仍被视为小数，而在 JavaScript/TypeScript 中，以 $0$ 为前导的整数字面量表示八进制！
:::

整数字面量的一些示例：

```tact
// decimal, base 10:
0, 42, 1_000, 020

// hexadecimal, base 16:
0xABC, 0xF, 0x0011

// octal, base 8:
0o777, 0o001

// binary, base 2:
0b01111001_01101111_01110101_00100000_01100001_01110010_01100101_00100000_01100001_01110111_01100101_01110011_01101111_01101101_01100101
```

有关整数和 [`Int{:tact}`](/zh-cn/book/integers)类型的更多信息，请访问专门页面：[整数](/zh-cn/book/integers)。

### 布尔字面量

[`Bool{:tact}`](/zh-cn/book/types#booleans)类型只有两个字面值：`true{:tact}`和`false{:tact}`。

```tact
true == true;
true != false;
```

有关布尔和 [`Bool{:tact}`](/zh-cn/book/types#booleans)类型的更多信息，请参阅专门章节：[布尔](/zh-cn/book/types#booleans)。

### 字符串字面量 {#string-literals}

字符串字面量是用双引号（`"`"）括起来的零个或多个字符。 字符串字面量是用双引号（`"`"）括起来的零个或多个字符。 所有字符串字面量都是 [`String{:tact}`][p]类型的对象。

```tact
"foo";
"1234";
```

Tact 字符串支持一系列从反斜杠字符开始的[转义序列](https://en.wikipedia.org/wiki/Escape_sequence)：

- `\\{:tact}` - 字面反斜线
- `\"{:tact}` - 双引号
- `\n{:tact}` - 换行
- `\r{:tact}` - 回车
- `\t{:tact}` - 制表符
- `\v{:tact}` — 垂直制表符 (vertical tab)。
- `\b{:tact}` — 退格符 (backspace)。
- `\f{:tact}` — 换页符 (form feed)。
- `\x00{:tact}`至`\xFF{:tact}` - [代码点](https://en.wikipedia.org/wiki/Code_point)，长度必须正好是两个十六进制数字
- `\u0000{:tact}`至`\uFFFF{:tact}` - [Unicode 代码点][unicode]，长度必须正好是四个十六进制数字
- `\u{0}{:tact}` 到 `\u{10FFFF}{:tact}` - [Unicode 代码点][unicode]，长度可以是 $1$ 到 $6$ 的十六进制数

[unicode]: https://en.wikipedia.org/wiki/Unicode#Codespace_and_code_points

```tact
// \\
"escape \\ if \\ you \\ can \\";

// \"
"this \"literally\" works";

// \n
"line \n another line";

// \r
"Shutters \r Like \r This \r One";

// \t
"spacing \t granted!";

// \v
"those \v words \v are \v aligned";

// \b
"rm\b\bcreate!";

// \f
"form \f feed";

// \x00 - \xFF
"this \x22literally\x22 works"; // \x22 represents a double quote

// \u0000 - \uFFFF
"danger, \u26A1 high voltage \u26A1"; // \u26A1 represents the ⚡ emoji

// \u{0} - \u{10FFFF}
"\u{1F602} LOL \u{1F602}"; // \u{1F602} represents the 😂 emoji
```

:::note

  阅读更多关于字符串和[`String{:tact}`][p]类型：\
  [书中的原始类型][p]\
  [参考资料中的字符串和字符串构造器](/zh-cn/ref/core-strings)的内容

:::

### `null` 字面量

`空{:tact}`值将以`null{:tact}` 字面形式写入。 它**不是**[标识符](#identifiers)，也不指向任何对象。 它也**不是**[原始类型][p]的实例。 相反，`null{:tact}` 表示缺乏识别以及故意不设置任何值。

```tact
let var: Int? = null; // variable, which can hold null value
var = 42;
if (var != null) {
    var!! + var!!;
}
```

有关使用 `null{:tact}`的更多信息，请访问专门页面：[选项](/zh-cn/book/optionals)。

## 标识符 {#identifiers}

标识符是代码中的一串字符，用于标识[变量](/zh-cn/book/statements#let)、[常量](/zh-cn/book/constants)、[映射](/zh-cn/book/maps)和[函数](/zh-cn/book/functions)，以及[结构][s]、[消息][m]、[合约](/zh-cn/book/contracts)、[trait](/zh-cn/book/types#traits)或它们的字段和方法。 标识符区分大小写，不加引号。 标识符区分大小写，不加引号。

在 Tact 中，标识符可以包含拉丁小写字母 (`a-z`)、拉丁大写字母 (`A-Z`)、下划线 (`_`)和数字 ($\mathrm{0 - 9}$)，但不能以数字开头。  标识符与 [字符串](#string-literals) 的区别在于，字符串是数据，而标识符是代码的一部分。

请注意，当[基元类型][p]的标识符以大写字母开头时。 请注意，当[基元类型][p]的标识符以大写字母开头时。 已使用定义的 [复合类型](/zh-cn/book/types#composite-types)，如 [Structs][s] 和 [Messages][m] 也必须大写。

## 实例化 {#instantiation}

您可以创建以下类型的实例：

- [结构][s]
- [信息][m]

```tact
struct StExample {
    fieldInit: Int = 1;
    fieldUninit: Int;
}

fun example() {
    // Instance with default value of fieldInit
    StExample{ fieldUninit: 2 };

    // Instance with both fields set
    StExample{
        fieldInit: 0,
        fieldUninit: 2, // trailing comma is allowed
    };
}
```

## 字段访问

您可以直接访问以下类型的字段：

- [结构][s]
- [信息][m]

```tact
struct StExample {
    fieldInit: Int = 1;
    fieldUninit: Int;
}

fun example(): Int {
    let struct: StExample = StExample{ fieldUninit: 2 }; // instantiation

    struct.fieldInit;          // access a field
    return struct.fieldUninit; // return field value from the function
}
```

## 扩展函数调用

[扩展函数](/zh-cn/book/functions#extension-function)仅在特定类型中定义。  它们的调用方式类似于许多其他语言中的方法调用：

```tact
42.toString(); // toString() is a stdlib function that is defined on Int type
```

## 静态函数调用 {#static-function-call}

在函数体的任何位置，都可以调用全局 [static function](/zh-cn/book/functions#global-static-functions) 或 [contract](/zh-cn/book/contracts) 的内部函数：

```tact
contract ExampleContract {
    receive() {
        now(); // now() is a static function of stdlib
        let expiration: Int = now() + 1000; // operation and variable definition
        expiration = self.answerQuestion(); // internal function
    }
    fun answerQuestion(): Int {
        return 42;
    }
}
```

## `initOf`

表达式 `initOf{:tact}` 计算 [contract](/zh-cn/book/contracts) 的初始状态 (`StateInit{:tact}`)：

```tact
//                     argument values for the init() function of the contract
//                     ↓   ↓
initOf ExampleContract(42, 100); // returns a Struct StateInit{}
//     ---------------
//     ↑
//     name of the contract
//     ↓
//     ---------------
initOf ExampleContract(
    42,  // first argument
    100, // second argument, trailing comma is allowed
);
```

其中，`StateInit{:tact}`是一个内置[结构][s]，由以下部分组成：

| 字段   | 类型                  | 说明
| :----- | :-------------------- | :---
| `code` | [`Cell{:tact}`][cell] | [合约](/zh-cn/book/contracts)的初始代码（编译后的字节码）
| `data` | [`Cell{:tact}`][cell] | [合约](/zh-cn/book/contracts)的初始数据（合约的 `init(){:tact}`函数参数）

[p]: /zh-cn/book/types#primitive-types
[cell]: /zh-cn/book/cells#cells
[s]: /zh-cn/book/structs-and-messages#structs
[m]: /zh-cn/book/structs-and-messages#messages
