软件设计师-错题笔记-程序语言
1.
解析:控制结构包含三类:顺序、选择(分支)和循环结构。
2.
解析:题干中说调用g(a)是用引用方式调用,所以实参和形参共享内存地址,对形参的修改会直接反映到实参上,所以答案为19+9=28
3.
解析:C:原发制导翻译是在语法分析的基础上,根据语言的语法规则,为每个语法单元附加语义动作或属性,通过对语法树的遍历执行这些语义动作,完成从源语言到目标语言的语义处理,属于静态语义分析的一种方法。
4.
解析:脚本语言和其他编程语言一样,都是支持是用变量来存储数据。编译型语言在执行前先将源程序全部编译成目标机器码,经过优化等处理,执行时效率通常较高。
5.
解析:动态语义错误是在程序运行时才显现的错误,本题中代码在运行时会出现无限循环,属于动态语义错误。
6.
解析:A:代码区主要存放程序的二进制代码,即编译后的机器指令,不是用于存储全局变量。B:静态数据区用于存储全局变量和静态局部变量。全局变量在程序开始运行时就分配空间,生命周期贯穿程序运行始终,存储在静态数据区。C:栈区用于存储函数调用时的局部变量、函数参数、返回地址等,函数执行结束,栈区中相关变量的存储空间会自动释放,不适合存储全局变量。D:堆区由程序员手动分配和释放内存,用于动态内存分配。
7.
解析:答案为B,为什么呢,因为形参一开始是没有地址的,需要实参的地址传递给形参,然后形参再做后续操作。
8.
解析:在C程序中,未赋值的变量会有不确定的值,使用它参与运算等操作时,运行结果不一定是期望的结果。
9.
解析:求取next函数值序列的简易方法:以上题为例:
1-0
2-1
3-ab-无-1
4-aba-a-2
5-abaa-a-2
6-abaab-ab-3
7-abaaba-aba-4
10.
解析:A:在编译过程中,词法分析是将源程序的字符流识别为单词序列,语法分析是基于词法分析得到的单词来分析程序的语法结构。必须先进行词法分析,才能为语法分析提供正确的单词单元,不能先进行语法分析再进行词法分析。B:语法分析阶段主要检查程序的语法结构是否正确,如语句是否符合语法规则、括号是否匹配等,但无法发现程序中的所有错误。像语义错误(如类型不匹配、逻辑错误等)在语法分析阶段不能被发现。C:语义分析阶段主要处理源程序的语义,包括类型检查、作用域分析等,是基于语言本身的语义规则进行的,与目标机器的体系结构没有直接关联。D:目标代码生成阶段是将经过前面阶段处理后的中级表示转换为目标机器的机器语言代码。不同的目标机器(如不同的CPU架构)有不同的指令集、寄存器等特性,所以目标代码生成阶段的工作与目标机器的体系结构密切相关。
11.
解析:
A:变量在程序运行过程中可以被重新赋值,其取值会发生改变;常量在定义后值就固定不变
B:常量也有类型属性。例如,整数常量5是整型。
C:变量用于存储数据,需要有对应的存储单元来存放其值;常量一般直接在代码中使用,不需要专门的存储单元
D:变量可以通过赋值语句改变其值,而常量在定义时就确定了值,不能再被赋值。
12.
解析:
A:可视化程序设计仍然需要编写代码来实现具体的业务逻辑,比如处理事件代码等。
13.
解析:在HTML中,创建指向邮箱地址的链接,需要使用mailto:协议。其基本语法格式为<a href="mailto:邮箱地址">链接文本</a>
14.
解析:
A:不同的数据类型占用的存储空间大小不同,例如整型可能占用4个字节,字符型占用一个字节等。知道数据类型后,编译器或者解释器便于为数据合理分配存储单元。
B:在表达式中,数据类型可以用于检查参与运算的数据对象是否合法。比如在C语言中,不能直接将字符型数据和浮点型数据进行不合理的运算,通过数据类型检查可以发现这类错误。
C:定义动态数据结构(如链表、动态数组等)主要依赖语言提供的内存管理机制(如指针、动态内存分配函数等),而不是数据类型本身直接便于定义动态数据结构。数据类型更多的是规定数据的性质。
D:数据类型规定了数据对象的取值区间,同时也规定了能够对该类型数据进行的运算,如整型可以进行加减乘除等运算,字符型可以进行连接等操作。
15.
解析:
A:指针变量和普通变量一样,既可以定义为全局变量(在函数外部定义),也可以定义为局部变量(在函数内部定义)
B:指针变量用于存储内存地址,通常占用固定大小的存储空间(如在32位系统中一般占4字节,64位系统中一般占8字节),而指针所指向的变量根据其数据类型不同,占用空间大小各异,二者存储空间大小一般不相同
C:指针变量的算数运算由实际意义。例如,对指针进行加法运算,指针会根据其所指向的数据类型的大小移动相应的字节数,常用于数组遍历等场景
D:指针变量可以指向静态分配的变量(如普通局部变量、全局变量),也可以指向动态分配的数据对象(通过malloc、new等分配),并非必须由动态产生的数据对象来赋值。
16.
解析:
A:静态存储分配是在程序编译时就确定变量的存储空间,且在程序运行期间大小固定不变。链表的特点是其长度在运行时可动态变化,元素个数不固定,不适合采用静态存储分配策略。
B:链表在运行时需要根据实际需求动态地申请和释放内存空间,堆区是程序运行时用于动态内存分配的区域,通过malloc(C语言)或new(C++语言)等操作从堆区获取内存来创建链表节点等,所以链表的数据空间必须采用堆存储分配策略。
C:指令空间主要存放程序的指令代码,和链表的数据存储没有直接关系,不需要采用栈结构来存储指令空间。
D:指令代码一般存放在代码区,而堆区主要用于存放动态分配的数据,不是存放指令代码的地方。
17.
解析:alink用于设置正在被击中的链接的颜色,vlink用于设置一使用的链接的颜色。
18.
解析:
A:词法分析阶段会将源程序的字符流按照词法规则识别为一个个单词(符号),检查构成程序的字符串及由字符按照构造规则构成的符号是否符合程序语言的规定,比如识别关键字、标识符、常量等
B:语法分析阶段是在词法分析得到单词的基础上,分析单词构成的语法结构是否符合语法规则,如语句的结构是否正确、括号是否匹配等
C:语义分析阶段主要处理源程序的语义,包括类型检查、作用域分析等
D:代码生成阶段是将经过阶段处理后的中间表示转换为目标机器的机器语言代码
19.
解析:
A:符号表主要用于记录源程序中各类符号(如变量、函数等)的属性信息,并非用来表示中间代码
B:后缀式(逆波兰式)和三地址码是常用的中间代码形式。后缀式将运算符紧跟在操作数之后,便于表达式的计算和处理;三地址码用类似汇编语言的形式,每条指令最多有三个操作数,能清晰表示运算过程
C:对中间代码进行优化主要依据源语言的语义和代码的逻辑结构等,而不是运行程序的机器特性。对目标代码优化才更依赖机器特性。
D:中间代码具有一定的平台独立性,可以跨平台。因为它是在编译过程中产生的与源语言和目标机器都有一定独立性的代码形式,后续根据不同目标平台进行目标代码生成。
20.
解析:
A:自顶向下(自上而下)语法分析方法是从开始符号出发,试图推导出给定的输入串,常见方法有递归下降分析法等,移进-归约分析法不属于此类
B:自底向上(自下而上)语法分析方法是从输入串开始,逐步进行归约,直到归约到开始符号。移进-归约分析法正是基于这种思想,它将输入符号逐个移进栈中,当栈顶符号串形成某个产生式的右部时,就将其归约为该产生式的左部符号,属于自底向上的语法分析方法。
21.
解析:栈和队列主要是用于数据存储和操作的抽象数据类型,一般不用于表示中间代码。中间代码通常采用后缀式、三地址码、语法树、控制流图等形式表示。
22.
解析:
A:符号表用于记录源程序中各类符号(如变量、函数等)的属性信息,在编译过程中,对于声明语句,主要是将符号的相关信息(如名称、类型、作用域等)正确填入符号表中
B:栈主要用于函数调用、表达式求值等过程中临时存储数据,不是用于存储声明语句信息
C:队列常用于按顺序处理数据,如广度优先搜索等场景,不适合存储声明语句信息
D:树(如语法树)主要用于表示程序的语法结构,不是专门用来存储声明语句所需信息的
23.
解析:
A:编译过程只是将源程序翻译成目标代码,并不执行代码,执行是在编译完成后由操作系统等运行环境来完成的
B:转换成语法树是语法分析阶段的任务,主要用于表示程序的语法结构,不是对可执行语句最终的翻译处理方式
C:在编译过程中,对于可执行语句,是将其翻译成中间代码或目标代码,中间代码便于进行优化等级操作,目标代码则是最终可在目标机器上运行的机器语言代码
D:有限自动机常用于词法分析等阶段,用于识别单词等,不是对可执行语句的翻译处理方式
24.
解析:
A:汇编语言源程序中的指令语句是面向机器的,最终会被汇编程序翻译成机器代码,以便计算机执行
B:伪指令是用于指导汇编程序进行汇编工作的,本身不对应机器编码,汇编程序在处理时,先处理伪指令(如分配存储单元等操作),但伪指令不会被翻译成机器代码,然后再将指令语句翻译成机器代码,所以该选项错误
C:汇编程序的功能就是将汇编语言源程序作为输入,经过翻译等处理,输出机器语言表示的目标程序
D:汇编语言的指令语句中操作码字段是必须的,用于指明要执行的操作,操作数字段根据具体指令情况可以没有,比如某些空操作指令
25.
解析:
A:词法分析是将源程序的字符流看作一个线性字符序列,依据词法规则把它识别为一个个单词
B:语法分析阶段依据语法规则对单词序列进行分析,能发现诸如语句结构错误、括号不匹配等语法错误,但不能发现所有错误,比如语义错误等在语法分析阶段无法检测到,不过在语法规则覆盖范围内,能发现所有语法错误
C:语义分析阶段主要进行类型检查、作用域分析等语义相关检查,但并不能发现程序中所有的语义错误。例如,程序的逻辑语义错误(如算法逻辑有误)在语义分析阶段难以发现
D:目标代码生成阶段是将经过前面阶段处理后的中间表示转换为目标机器语言代码,不同目标机器体系结构不同(如指令集、寄存器等),所以该阶段工作与目标机器的体系结构相关
26.
解析:因为反编译虽然能得到执行功能一样的代码,但是像注释之类的东西会丢失,所以和源文件还是不一样的,说还原就错误了。
27.
解析:词法分析的输出是记号流,也就是与语法分析的输入。
28.
解析:这类题目直接代入最直观,把NFA中所有可能出现的结果列举一遍,再在答案中找。
29.
解析:自顶向下和自底向上的区别:自顶向下的语法分析是从开始符号开始,逐步推导产生输入符号串;而自底向上的语法分析是从输入符号串开始,逐步归约到开始符号。
29.
解析:举例,可得出可能有结果为1010或者0101,则能表示所有0和1个数不同的字符串。
30.
解析:语言L中的字符串特点是a的个数与b的个数相同,且所有的a都在b之前,正规式(正则表达式)无法保证a和b的数量相等,且正规式中没有指数的表示方式
31.
解析:这类题型需要看清题意,注意表述的左结合或者右结合情况。
32.
解析:C选项表示先有任意多个1,然后任意多个0,最后01,没有体现出01交替的情况。
33.
解析:
分析M1:对于输入符号0,有两个转移方向
分析M2:每个都有唯一的状态转移、
33.
解析:注意这里需要考虑算数优先级,逻辑与要高于逻辑或,所以还原原来的树就不一样。