Files
Sec-Interview/Chapter23/23-7.md
T
2025-09-25 04:02:19 +08:00

53 lines
2.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
### 说说 If/Else 语法树
**`If/Else` 语法树的结构**
一个典型的 `if/else` 语法树通常包含一个根节点和三个子节点,反映了 `if/else` 语句的三个核心部分:
1. **条件表达式(Condition Expression**:这是 `if` 语句括号里的布尔表达式。它会被编译成判断条件是否为真的机器码。在语法树中,它通常是 `if/else` 根节点的一个子节点
2. **真分支(True Branch**:这是当条件表达式为真时执行的代码块。在语法树中,它是一个子树,根节点通常表示为 `Then``True`,其子节点代表了该代码块中的所有语句
3. **假分支(False Branch**:这是当条件表达式为假时执行的代码块(即 `else` 后面的部分)。它也是一个子树,根节点通常表示为 `Else``False`,其子节点代表了该代码块中的所有语句
如果是一个简单的 `if` 语句(没有 `else`),那么假分支节点可能为空或不存在
**举例说明**
让我们以一段简单的 C 语言代码为例,看看它的 `if/else` 语法树长什么样
**源代码:**
```c
if (a > 5) {
b = 10;
} else {
c = 20;
}
```
**对应的语法树结构:**
```
If-Else
/ | \
/ | \
条件 真分支 假分支
/ | \
> = =
/ \ / \ / \
a 5 b 10 c 20
```
**节点解释:**
- **根节点**`If-Else`,表示这是一个条件语句
- **左子节点**`>`,表示条件表达式是比较操作。它的子节点是 `a``5`,表示比较的是变量 `a` 和常量 `5`
- **中间子节点**`=`,表示真分支的代码是赋值操作。它的子节点是 `b``10`
- **右子节点**`=`,表示假分支的代码也是赋值操作。它的子节点是 `c``20`
**语法树的作用**
在编译过程中,生成语法树是一个非常关键的中间步骤。编译器利用这个树形结构来:
- **进行语法检查**:确保代码结构正确
- **生成中间代码**:编译器可以遍历这棵树,将其转换成更低级别的代码表示,如三地址码
- **进行代码优化**:例如,如果 `if` 语句的条件是一个常量,并且总是为真或假,编译器可以在编译时就删除掉永远不会执行的分支,从而优化代码