程序设计语言
简介
考察概念题为主, 计算题偏少,分值3到6分
题号分布:20、21、22、48、49、50
编译程序和解释程序
汇编语言–》汇编程序—》目标程序—》执行
高级语言—》解释程序
高级语言—》编译程序
解释后直接执行或者翻译为中间代码后执行
编译生成目标程序,独立执行
真题
B
C
A
A
C
程序设计语言基本成分
为数据合理分配存储单元的意义:
真题
B
重复=循环
A
C
B
B
C
隐式转换为整型变量
运算先得把数据类型统一,会把小数据范围向大数据范围对齐
B
变量存储在堆,常量存储在方法区的常量池中、
C
C
左结合,从左向右执行
右结合,从右向左执行
短路
对于A选项:必须得当X和Y都为真才行
对于B选项:如果Z为假,表达式还是真
C选项,当Y为真,表达式为真,和Z取值无关了
当Y为假,表达式的取值和Z有关。
D选项:X为假,则Z的取值决定表达式的值
B
对于A选项:
x为真,还得看后面括号内取值是否为真
对于B选项:
X为假,则表达式为假,和后面无关了
对于C选项:
逻辑或是左结合,应该是依据Y的值来决定是否算Z的值
对于D选项:
X为假,则表达式为假,不用算了
B
传值调用和传地址调用
值调用:传递的是函数值,不改变实参
引用调用:传递的是实参地址,改变实参的值
代码实现
值传递不改变实参的值
注意传值调用实参可以是变量,常量和表达式
形参和实参是俩个变量
引用传递改变实参的值
注意传递的参数不能是常量和表达式
实参和形参是一个变量
指针实现
总结:
VScode安装博文:VScode安装BUG
C++指针和引用的区别: 指针和引用的区别
真题
C
D选项中,需要传递地址,实参不能是任意的变量和表达式
C
A选项中,是将实参的值传递给形参
B选选项中,是实参可以是任意形式的表达式
D选项中,是把实参的地址传递给形参。
D
对于B选项,
A,C都是应该将实参的.XXX传递给形参
C
A
B
传值调用:把实参的值传递给形参
传引用调用:把实参的地址传递给形参
C
C
D (传引用:初始值:r=a=5)
A
D
\
B
D
D
B
引用调用:
值调用:
A
C
编译,解释程序翻译阶段
真题
C
C
对于D,中间代码的生成是可以省略的(和优化有关)
D
C,B
编译器生成目标程序,但源程序和目标程序不需要参与到控制当中
解释器不生成目标程序,参与控制
符号表
真题
A
C
声明语句====符号啥啥啥的。。
A
可以用排除法,把数据结构的排除就行
B
看到符号,类型,特性信息,选符号表
B
编译过程概述
词法分析
词法分析出题频率很低,多作为干扰选项来考
词法分析的输入、输入、和作用如下:
- 源程序可以简单地被看成是一个多行的字符串。
- 词法分析阶段是编译过程的第一个阶段,
- 这个阶段的任务是: 对源程序从前到后(从左到右)逐个字符地扫描,从中识别出一个个“单词”符号。
- “单词”符号是程序设计语言的基本语法单位,如关键字(或称保留字)、标识符、常数、运算符和分隔符(如标点符号、左右括号)等。
- 词法分析程序输出的“单词”常以二元组的方式输出,即单词种别和单词自身的值。
- 词法分析过程依据的是语言的词法规则,即描述“单词”结构的规则。例如,对于某PASCAL源程序中的一条声明语句和赋值语句
语法分析
语法分析阶段可以发现程序中所有的语法错误
作用:
- 在词法分析的基础上,根据语言的语法规则将单词符号序列分解成各类语法单位,如“表达式”“语句”和“程序”等。
- 如果源程序中没有语法错误,语法分析后就能正确地构造出其语法树;否则指出语法错误,并给出相应的诊断信息。
(为了确定这一行语句的结构有没有问题)
典型的错误例子如下:
少写分号
括号不匹配,少分号
变量b没有声明
少赋值符号
语义分析
- 静态语义检查错误
- 类型分析和检查
典型的错误例子如下:
赋类型不匹配错误
还是类型不匹配
注意区分点:
动态语义错误需要运行才能检查出来。
目标代码生成
一般作为干扰选项出现(考察语法分析多一些)
小结
真题
C
对于A:
词法分析的输入是源程序,把他看成多行的字符串,然后从上到下,从左到右进行扫描,识别出一个个单词和符号。
对于C,发现所有静态语义错误
A
对于B,是在语义分析阶段来确定的。
类型不匹配错误。
对于C,语法分析只能确定循环结构是否写对,括号少没少,有没有结束分号
少了循环体的结束括号
对于D,也只能看循环条件中分号少没少,结构对不对
对于A:
A
D
D
B
词法分析:扫描字符,识别单词
语法分析:判断语句形式是否正确
语义分析:判断类型是否匹配,除法和取余是否分母是否合规
C
B
C
A
A,B
B
动态语义错误
其中静态语义错误是分母是小数,可以检查出
动态语义错误比如:分母为0,则只有执行才能检查出来
真题
D
没赋值的变量,他的值是内存中的垃圾值
A
编译正确的程序必然不包含静态语法错误(这里题干将的语义错误包含静态的动态,所以错了)
除数为0只能在运行阶段检查出来(动态语义错误)
D
对于C,错在报告的是语义错误(动态语义错误)
C
死循环,动态语义错误,运行才能检测出来
D
循环体为空,且死循环,导致后面的代码无法被执行
中间代码生成阶段
常见的中间代码:
- 后缀式
- 三地址码
- 三元式
- 四元式
- 树
- 图
真题
D
D
B
D
B (三地址码的实现方式是四元式)
对于C
六个阶段都和符号表有相关性
B
对于C,不需要依据运行程序的机器特性
正规式
是词法分析的工具
*的取值范围是【0,无穷大】,然后把*去取值,看符不符合题目要求
真题
B
B
B
注意看m是大于等于0,n是大于等于1(之前读题错了)
A
咋一看全是以b结尾的
其实题意就是:所有以b为结尾的字符串集合(符合所有用b结尾的字符串的集合)
对于A,不能满足aab(a连续出现的形式)
对于b,不能满足bab形式
对于c,不能满足bab形式
有限自动机
确定和不确定有限自动机的区别在于:
- 给一个数字或者字母它只有一条路可以跑,那就是确定,
- 反之是不确定,
- 例如上面的图给个a,它很明显有两条路可以跑,所以是不确定有限自动机
其中a,b表示,可以识别a或识别b
给定字符1,s0状态可以跑自己,也可以从s0转移到s1,所以是不确定自动机(给一个数字或者字母它有多条路可以跑)
一个状态既可以是初态,又可以是终态
可以存在多个终态
转移状态:指出去的箭头 (例如,下图中,q1识别了0之后,从q1转移到q0)
识别成功的依据是:路跑的通,并且跑完后的终点是终态(重点)
解释一下︰路跑的通是指根据那个顺序能够跑的通,例如上图中给的顺序是010这是可以跑通的,如果给的顺序是011就跑不通了,因为第一个数字0是q0跑自己的路,第二个数字1是q0跑到q1,第三个数字1是指q1能够有这条1的出路,但是q1只有0这条出路,所以跑不通,同时必须满足跑完最后的终点是终态,例如上面的010是可以跑通,但是跑完后的终点是q0,在上面图中q1才是终态,所以这个顺序是错的; 如果0101就可以正确识别,这个串就是合法的。
识别aab最后也是不合法的,最后不是终态。。
特殊符号–》ε :表示空(不用识别字符,可以直接跳过)
00可以正确识别。
真题
A
D
对于C:可以识别01001,(这样的话,01串的0后面是0,(有俩连续的0))
对于B,不一定是偶数,直接1就奇数
对于A直接一个1结束。
B
C
C
A
认真读题,说的是不正确的(其中,本体初态和终态是一致的)
对于A选项,baa,就是连续的a
对于D,识别空串,初态直接到终态,对了
A
对于识别a
排除B,C
对于识别ba
排除D
D
如果识别1,则直接结束,排除A,B
结尾必为1
B
C
A
A
C
识别000,排除A
识别01…10排除D(0111…100),B(0011…10)
B
D
对于C和B
对于A
D
对于M1的A节点,0有俩分支,所以M1是不确定自动机
而M2是确定自动机
排除A,B
D
A
观察自动机的特点:必须以01结束
排除B
对于C
自动机可以到终点再往回走,再回来?他是这意思,姑且这么认为。
对于D
自动机可以是:101101,但正规式无法满足
A
aa为例来排除
B
自动机可以表示0100000
排除C
上下文无关文法
可能用上下文有关文发来迷惑大家
主要考察:
- 终结符号
- 推导过程
- 大多数程序设计语言用无关文法描述
- 推到题,根据文法推导选项
真题
A
A
做题方法:先把上下文法的表达式写出来,其表达式如下:
一般小写符号是终结符号,不能再往下推理了
对于A
推导的句子不是以a开头
对于D,abcd不能往下再推到了,所以是终结符号集
对于C
对于B,
B
B
B
C
对于AB选项
看出,推导的既有0也有1,所以排除
对于CD
所以01相同
B
注意解题的思路(主要是凑符号,按照符号来凑)
通过文法构造得到ABCD四个选项
对于A,前面的2无法构造
对于B
符合
A
注意:默认从第一个大写字母E开始
对于B
推不出来
关于CD可以排除,应为C中有数字,D有除号
虽然推理C为:
但C和2不同(变量和数字)
A
中缀,后缀表达式转换(较高频)
回顾之前的中间代码表示:
这里面就包括后缀式
后缀式又叫逆波兰式
中缀式转后缀式
- 中缀式转后缀式就是把符号位放在最后,并做为一个新的整体ab?,替换原来的中缀式a?b,
- 运算符优先级相同,是从右向左运算。(更正,大部分情况应该是从左往右)
- 后缀式转中缀式使栈
中缀式转后缀式的具体流程如下:
将3+4转换为34+
得到:(从此34+就是一个整体了)
将34+/5转换为34+5/
得到
将2x34+5/转换得到234+5/x
得到
最后转换负号:
得到:
后缀式转中缀式
将后缀转中缀(使用栈)或(ab?转a?b)
- 数字就入栈
- 碰到运算符,弹栈(弹俩个数字),第一个数字再表达式右边,第二个数字再表达式左边,和表达式结合为整体再入栈
- 想快就用公式:ab?转a?b
4代替b的位置,3代替a的位置
得到:
入栈减号时:
得到中缀表达式(或者用ab?转a?b也行)这种的快,如下图所示:
语法树中序、后序遍历
根据语法树推导出中缀式,后缀式
求解方法:
中序遍历:左根右(得到中缀式)
得到中缀式,
再转后缀式:(用之前中缀转后缀的公式计算)
其中求中缀式的过程(中序遍历如下)
后序遍历:左右根(得到后缀式)
得到后缀式,
其中求后缀式的过程(后序遍历如下)
一些例子
这是中缀式计算过程
后缀式计算过程
再用之前后缀转中缀栈的方式验证:
再用之前中缀式转后缀式的方法验证:
。。。。有小bug…(是从左往右,之前有误)
所以正确的是:
真题
D
优先级
计算过程如下:
B
逆波兰式就是后缀式
C
D
要点1:a?b转ab?
要点2,:转出来的以后都看成是一个整体
C
B
A
A
D
A
B
二叉树中序遍历(别忘了整体括号)
对于ABCD
A
B
二叉树后序遍历
C
中序遍历
C
后序遍历
C
中序
杂题精选
考的偏,考的点很奇怪的题目
A
C
脚本语言是动态语言,动态语言都是解释性语言(python)
对于B脚本语言是解释语言,不生成目标程序
A
对于C算术加减运算有意义,乘除没有意义
无论指针变量指向的变量是那种类型,指针变量的长度是固定的
B
D
PHP是脚本语言
A
B
A
A
D
C
B
B
语法分析
- 自顶向下:递归下降,预测分析
- 自底向上:算符优先,LR分析法,移进-归约分析法
C
B
B
A
JAVA既是编译型,又是解释型。
A
A
C
区别于之前的语法分析法
CD
A
A
B
是解释性脚本语言,不生成目标程序。。
C
B
总结
后缀式,自动机,引用调用,值调用,上下文无关文法,正规式,