 

## Debug

### VSCode中的Debug

![image-20260310200317228](https://chenalna.oss-cn-hangzhou.aliyuncs.com/img/image-20260310200317228.png)

 

**红色圆点为断点**

**黄色箭头为待执行的语句**

![image-20260310200344746](https://chenalna.oss-cn-hangzhou.aliyuncs.com/img/image-20260310200344746.png)

### 六个选项

**debug 中 continue（执行代码至断点）、step over（单步跳过）、step in（单步调试/执行）、step out（单步跳出/回滚） 全部重新执行 停止执行**

#### continue——执行至下一个断点

函数里面有断点，会执行到函数里面的断点处

![image-20260310200405698](https://chenalna.oss-cn-hangzhou.aliyuncs.com/img/image-20260310200405698.png)

这个执行顺序是：第7行 -> 第3行 -> 第9行 -> 第3行 -> 第11行 -> 第3行 -> 结束

![image-20260310200253710](https://chenalna.oss-cn-hangzhou.aliyuncs.com/img/image-20260310200253710.png)

这个执行顺序是：第7行 -> 第9行 -> 第11行 -> 结束

注意 continue（继续）键会忽略灰色的断点（代码里的圆型灰点），只会执行红色的断点。

#### step over单步跳过/逐过程

一行行往下走，把没有断点的子函数当作一步。

启动调试后，点击 step over，如果当前行是函数，且函数里面有断点，会执行到函数里面的断点处。否则这一行函数内没有断点，则不会进入函数内。

![image-20260310200405698](https://chenalna.oss-cn-hangzhou.aliyuncs.com/img/image-20260310200405698.png)

这个执行顺序是：第7行 -> 第3行 -> 第4行 -> 第7行 -> 第9行 -> 第3行 -> 第4行 -> 第9行 -> 第11行 -> 第3行 -> 第4行 -> 第11行 -> 结束

![image-20260310200253710](https://chenalna.oss-cn-hangzhou.aliyuncs.com/img/image-20260310200253710.png)

 这个执行顺序是：第7行 -> 第9行 -> 第11行 -> 结束



 注意 step over（单步跳过）键会忽略灰色的断点（代码里的圆型灰点），只会执行红色的断点

- **用途**：逐过程用于在不深入函数内部的情况下逐行检查代码。它有助于你跳过函数的内部执行并直接查看函数的返回结果。

#### Step into单步调试/逐语句/单步执行

![image-20260310200253710](https://chenalna.oss-cn-hangzhou.aliyuncs.com/img/image-20260310200253710.png)

如果当前执行到第七行，step in会进入mergestring函数内部。Step over（单步跳过）执行函数内部的代码。

如果这一行上有子函数，且子函数内没有断点，也会进入子函数的第一行，一行行走完子函数

子函数内有断点，仍然会跳到子函数的第一行，从第一行开始，一行行执行。

- **用途**：单步调试用于深入函数内部的代码执行，以便逐行检查函数内部的执行情况。这对于理解函数内部的逻辑非常有用。

遇到子函数就进入并且继续单步执行。

注意 step into（单步调试）键会执行灰色的断点（代码里的圆型灰点）。

#### Stepout 单步跳出

如果子函数内没有断点，直接跳出子函数。

如果子函数内有断点，会执行完断点后跳出子函数。

跳出当前函数，如果当前行不在函数内，继续（continue）执行到下一个断点。

- **用途**：单步跳出用于从深层嵌套的函数中返回到调用函数的上下文。当你不想逐行检查当前函数内部的代码，而是想跳回到函数的调用方时，可以使用这个操作。

- "逐过程"用于执行当前行并移到下一行，不深入函数内部。
- "单步调试"用于深入函数内部的代码执行，逐行检查函数内部的逻辑。
- "单步跳出"用于从当前函数内部返回到调用函数的上下文。

 **总结**

逐语句，就是每次执行一行语句，如果碰到函数调用，它就会进入到函数里面。

逐过程，碰到函数时，不进入函数，把函数调用当成一条语句执行。

跳出，是当你进入到函数内，跳出可以让你直接执行函数内剩余的语句，直到返回到该函数被调用时的后面的语句处。

若要查看函数调用内容，请使用“逐语句”。

若要避免单步执行函数，请使用“逐过程”。

#### Restart重启调试

#### Stop停止调试

头节点为空在c语言里的意义比较大，尤其是判空。头节点也可以做其他事情，例如储存长度，奇数或者偶数数量
null是所有程序员的心头之患，为了防止出现这个，就定义了头节点。有了头节点就不需要判空了。





```
为实现算符优先算法，可以使用两个工作栈。一个称做 OPTR, 用以寄存运算符；另
一个称做 OPND, 用以寄存操作数或运算结果。算法的基本思想是：
(1) 首先置操作数栈为空栈，表达式起始符"#"为运算符栈的栈底元素；
(2) 依次读入表达式中每个字符，若是操作数则进 OPND 栈，若是运算符则和
OPTR 栈的栈顶运算符比较优先权后作相应操作，直至整个表达式求值完毕（即 OPTR
栈的栈顶元素和当前读入的字符均为"# ")。
首先要了解四则运算的规则：
1、先乘除后加减
2、从左算到右
3、先括号内，后括号外
由规则 (3)' 十、一、＊和／为 θ1 时的优先性均低于" ("但高于")'；
但是“（”和“）”为θ1时优先性均低于+、-、*、/，为什么？
OperandType EvaluateExpression() {
II 算术表达式求值的算符优先算法。设 OPTR 和 OPND 分别为运算符栈和运算数栈，
II OP 为运算符集合。
InitStack (OPTR); Push (OPTR,'#');
initStack (OPND); c = getchar();
while (c! ='#'|| GetTop(OPTR) ! ='#') {
if(! In(c, OP)){Push((OPND, c); c = getchar();}// 不是运算符则进栈
else
switch (Precede(GetTop(OPTR), c)) {
case'<', II 栈顶元素优先权低
Push(OPTR, c); C = getchar();
break;
case'=', II 脱括号并接收下一字符
Pop(OPTR, x); c = getchar();
break;

case'>': II 退栈并将运算结果人栈
Pop(OPTR, 七beta);
Pop(OPND, b); Pop(OPND, theta)；
Push(OPND, Operate(a, theta, b));
break;
}II switch
}II while
return GetTop(OPND);
}II EvaluateExpression
```



你真需要三个头文件？

头文件引入必要的头文件

.h和.c



C++部分

```
CSet & CSet::operator=(const CSet &rhs)
{
CSet temp(rhs);
m_pHead=temp.m_pHead;
temp.m_pHeaad=t;
return *this;
}
class Animal(){move()=0;eat()=0};//虚基类
class Mamal:public Animal{move();eat()}//重写move,eat
class Bird:public Animal{(move();eat()}//重写move,eat
class ManmalBird:public Mamal,Bird{move(),eat();}//重写move，eat
Animal * =new ManmalBird;
animal ->eat();
animal->move();

```

