1) switch中满足 case 后,就会执行到 break才跳出。
上面c='2' c-'2'为0时,会执行 case 0 case 1 case 2 才跳出。所以会输出 66
c='4' 执行 case 2 跳出 , 输出 8
c='7' 执行 default 输出 9
c='3' 执行 case 1 case 2 跳出 输出 77
最后,c='\n' 跳出while循环 输出 '\n'的ASCII值 10
连在一起就是 66897710
2) getchar() 这是个宏,stdioh里可以看到它。
它要接收到回车才会结束。所以不是你一输入2就会进行 switch *** 作。而是输入回车后,才会把之前的 2 4 7 3 '\n'一个个返回给c 进行 while循环。
一般的编译器可能包含下面这些模块:
1, 词法分析器:
输入: 源代码
输出: token
2, 语法分析器:
输入: token
输出: AST
在这个过程中, 可以识别出不符合语法规则的语句, 就可以报syntax错误, 如果有syntax错误, 编译结束
3, 语义分析器:
输入: AST
输出: 无
在这个过程中, 根据语言的语义规则来识别语义错误, 要识别语义错误 就必须编译AST, 因为是树的遍历, 假如你先遍历到了int a 这个节点, 接着又遍历到了一个表达式a = 4这个节点, 你需要检查变量a有没有声明啊, 变量a和4的类型批不匹配呢 这时你如果没有保存变量a的信息, 那么你怎么检查 所以就需要符号表来保存这些信息了
4, 代码优化:
最简单的就是常量折叠优化了, 比如: a = 1 + 2 这个语句可以直接换成: a = 3了, 也就是说在编译阶段就把一些必要的运算先计算完成, 在程序运行的时候就不需要计算这些了, 就提高了程序的运行效率 这部分是最复杂的了, 还有各种各样各样的优化
5, 代码生成:
输入: AST
输出: 可以是虚拟机代码, 可以是本地汇编代码
下载后的ILSPY。打开EXE然后会在最下面出现打开的exe。结构如下图:类---方法。点击方法后,会在右面出现,方法的具体代码。ILspy很强大,甚至方法的参数都和源代码相同,只是方法里面的参数名字会自动生成。那么,如何保存反编译的源代码?整体保存源代码,可以点击你的反编译的程序。如图选择程序集或是里面的类或是方法后。点击File->savecode。如果是导出exe全部,会生成一个类库。保存类库即可。那么如何运行编译反编译的源码?重新建立一个对应的项目(反编译源码是winform就建立一个winform程序。)在解决方案上添加------->现有项。然后删除新建立的空的winform代码。保留刚才添加进来的源码。如图所示:然后直接点击运行直接可以运行软件了。反编译后的软件,直接生产了类,大家可以根据需要修改。6毕竟NET和JAVA属于中间语言,很好反编译。那么如何保护自己的代码安全?防止别人反编译或是查看自己的源码呢,下面的经验中将进行介绍:如何给代码加壳
有同学问:能否详细说一下 diff 算法。
详细的说,请阅读这篇文章,有疑问的地方欢迎留言一起讨论。
因为 diff 算法是 vue2x , vue3x 以及 react 中关键核心点,理解 diff 算法,更有助于理解各个框架本质。
说到「diff 算法」,不得不说「虚拟 Dom」,因为这两个息息相关。
比如:
等等
我们先来说说虚拟 Dom,就是通过 JS 模拟实现 DOM ,接下来难点就是如何判断旧对象和新对象之间的差异。
Dom 是多叉树结构,如果需要完整的对比两棵树的差异,那么算法的时间复杂度 O(n ^ 3),这个复杂度很难让人接收,尤其在 n 很大的情况下,于是 React 团队优化了算法,实现了 O(n) 的复杂度来对比差异。
实现 O(n) 复杂度的关键就是只对比同层的节点,而不是跨层对比,这也是考虑到在实际业务中很少会去跨层的移动 DOM 元素。
虚拟 DOM 差异算法的步骤分为 2 步:
实际 diff 算法比较中,节点比较主要有 5 种规则的比较
部分源码 >
以上就是关于给出c语言while语句与switch语句的抽象语法树结构全部的内容,包括:给出c语言while语句与switch语句的抽象语法树结构、符号表和抽象语法树是什么关系两者在编译器设计中是否必需、如何动态编译C#源代码并获取其语法树等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)