一、2025年真题
1.某应用软件的各个功能模块采用不同的程序设计语言来编写,分别编译并产生( ),再经过( )后形成可执行程序。
第一空选项:
A. 中间代码 非通用情况
B. 抽象语法树 语法分析的产物,不是最终编译结果
C. 目标代码
D. 汇编程序 是一种程序,不是编译产物
编译六阶段:词法分析→语法分析→语义分析→可选(中间代码生成→代码优化)→目标代码生成
第二空选项:
A. 交叉编译 在一个平台上编译出能在另一个不同架构或操作系统上运行的可执行程序
B. 反汇编 可以得到等价的汇编语言,得不到一样的源程序
C. 预处理 在编译之前,处理源代码中的预处理指令,如宏展开(#define)、文件包含(#include)、条件编译(#ifdef)等。
D. 链接
多个模块分别编译后,需要把:各目标文件/库文件组合成最终可执行文件。
这个过程叫:链接(Link)
2.在 C 语言中,函数调用的实参是数组名,是将( )传递给形参。
A. 数组首元素地址
B. 数组元素的个数
C. 数组空间的大小
D. 数组首元素的值
只有传值和传地址两种方式,按照排除法可选出
三、按知识点分类的往年题
1.函数调用时基本的参数传递方式有传值与传地址两种()。
传值:单向传,实参啥都行(变量/常量/表达式)。
引用:双向传,实参必须有地址(只能是变量)。
A在传值方式下,形参将值传给实参
方向说反了。传值时是实参把值复制给形参
B在传值方式下,实参不能是数组元素
数组元素如 arr[2] 本身就是一个变量,完全可以作为传值调用的实参。
C在传地址方式下,形参和实参间可以实现数据的双向传递
正确。形参拿到的是实参地址,所有修改都作用在同一块内存上。
D在传地址方式下,实参可以是变量也可以是表达式
传地址时,实参必须是具体可寻址的对象——变量、数组元素等左值可以,但普通表达式不行。
2.已知某高级语言源程序A 经编译后得到机器C 上的目标程序B,则()。
A 对B 进行反编译,不能还原出源程序A
反编译工具只能根据机器码猜测逻辑结构,生成一个近似的 C 代码,但绝对不可能完美还原出原始的源程序 A。
B 对B 进行反汇编,不能得到与源程序A 等价的汇编程序代码
这里注意第一是反汇编,第二它没有说完全还原,而是等价的,所以是可行的
C 对B 进行反编译,可得到源程序A 的算法结构
理由同A
D 对A 和B 进行交叉编译,可以产生在机器C 上运行的动态链接库
交叉编译是指在一台机器上生成另一台机器上运行的目标代码。这里这个ABC三个设备不符合
3.关于程序语言的说法,错误的是()。
A 脚本语言属于动态语言,其程序结构可以在运行中改变
这正是动态语言的特性。像 JavaScript,可以在运行时随时给一个对象添加新属性或方法。
B 脚本语言一般通过脚本引擎解释执行,不产生独立保存的目标程序
比如 Python 源码通过 Python 解释器运行,JS 通过浏览器的 JS 引擎执行,通常直接解释源码,不产生像 C 编译后那样的 .exe 独立二进制目标文件。
C php、JavaScript属于静态语言,其所有成分可在编译时确定
D C 语言属于静态语言,其所有成分可在编译时确定
C 语言需要在运行前编译,变量有严格的静态类型,结构体成员在编译时就完全确定了。
4.逻辑表达式“a∧b∨c∧(b∨x>0)”的后缀式为( )。(其中∧、∨分别表示逻辑与、逻辑或,>表示关系运算大于,对逻辑表达式进行短路求值)
操作数 → 直接输出
运算符 → 和栈顶比优先级
栈空或栈顶是 ( → 直接压栈,不比较优先级
新进栈的运算符优先级更高 → 不弹栈,继续压入
新进栈的运算符优先级更低或相对→ 弹出旧的栈顶
>(关系运算)最高∧(逻辑与)次之∨(逻辑或)最低
(一直压栈,直到遇到),右括号不进栈,直接把括号内剩余的运算符弹出,左括号扔掉。所以最后的结果不会有任何括号
a b ∧ c b x 0 > ∨ ∧ ∨
abcdbx0这种操作数是直接输出的,这里问题在于∧ 这个符号
a∧b∨c∧(b∨x>0)
扫描到
a→ 输出a扫描到
∧→ 暂存栈中扫描到
b→ 输出b扫描到
∨→ 此时∧该输出了(新进来的优先级低),输出∧;然后∨进栈扫描到
c→ 输出c所以输出是 a b ∧ c
5.分析 编译程序对C 语言源程序进行语法分析时,可以确定 ( ) 。
A 变量是否定义(或声明)
很多编译器在语义分析阶段检查变量定义
B 变量的值是否正确
运行时才能确定的
C 循环语句的执行次数
运行时才能确定的
D 循环条件是否正确
这是逻辑/语义层面是否正确,取决于程序员的设计意图,也不是语法分析能判断的。
6.7.算术表达式采用逆波兰式表示时不用括号,可以利用( 6 )进行求值。与逆波兰式ab-cd+*对应的中缀表达式是( 7 )。
栈
逆波兰式就是后缀式
这里可以把选项一个个试,B选项应该是星号在前面,但是题目是先输出了加法,肯定是有括号干预,才没有按照优先级去输出
B(a-b)*c+d → a b - c * d +
C(a-b)*(c+d) → a b - c d + *
8.若一种程序设计语言规定其程序中的数据必须具有类型,则有利于( )。
①在翻译程序的过程中为数据合理分配存储单元
②对参与表达式计算的数据对象进行检查
③定义和应用动态数据结构
④规定数据对象的取值范围及能够进行的运算
⑤对数据进行强制类型转换
9.算术表达式x-(y+c)*8的后缀式是( ) (-、+、*表示算术的减、加、乘运算,运算符的优先级和结合性遵循惯例)。
x y c +8*-
10.以下关于解释程序和编译程序的叙述中,正确的是( )。
编译程序生成源程序的目标程序,解释程序则不然
11.以下关于传值调用与引用调用的叙述中,正确的是( )。
传值:单向传,实参啥都行(变量/常量/表达式)。
引用:双向传,实参必须有地址(只能是变量)。
①在传值调用方式下,可以实现形参和实参间双向传递数据的效果
②在传值调用方式下,实参可以是变量,也可以是常量和表达式
③在引用调用方式下,可以实现形参和实参间双向传递数据的效果
④在引用调用方式下,实参可以是变量,也可以是常量和表达式
12.在对高级语言源程序进行编译的过程中,为源程序中变量所分配的存储单元的地址属于( )。
A逻辑地址
物理地址是程序加载到内存并正式运行时,内存硬件所使用的实际地址
13.以下关于程序设计语言的叙述中,错误的是( )。
A程序设计语言的基本成分包括数据、运算、控制和传输等
B高级程序设计语言不依赖于具体的机器硬件
C程序中局部变量的值在运行时不能改变
D程序中常量的值在运行时不能改变
14.与算术表达式“(a+(b-c))*d”对应的树是 ( )。
按照运算顺序拆分即可,比如b和c直接肯定是相减,然后再和a+

15.程序中全局变量的存储空间在( )分配。
A 代码区:程序的机器指令、常量
B 静态数据区
C 栈区:函数形参、非静态局部变量、返回地址等
D 堆区:动态分配的内存
其中栈区和堆区也称为动态数据区。全局变量的存储空间在静态数据区。
16.以下关于高级程序设计语言实现的编译和解释方式的叙述中,正确的是( )。
A 编译程序不参与用户程序的运行控制,而解释程序则参与
编译程序:一次性把源代码翻译成独立的目标程序后,它的任务就完成了。之后运行目标程序时,编译器不再介入。
解释程序:边读源代码边执行,它直接控制着程序的运行——每当执行到某一行,解释器就要翻译该行并立刻执行。在程序运行的整个过程中,解释器始终“在场”。
B 编译程序可以用高级语言编写,而解释程序只能用汇编语言编写
C 编译方式处理源程序时不进行优化,而解释方式则进行优化 并且说反了
D 编译方式不生成源程序的目标程序,而解释方式则生成
17.以下关于脚本语言的叙述中,正确的是( )。
A 脚本语言是通用的程序设计语言
脚本语言通常被归类为领域专用语言
通用程序设计语言(如 C、C++、Java)
B 脚本语言更适合应用在系统级程序开发中
系统级程序开发基本由 C/C++/Rust 等编译型语言承担
C 脚本语言主要采用解释方式实现
D 脚本语言中不能定义函数和调用函数
18.将高级语言源程序先转化为一种中间代码是现代编译器的常见处理方式。常用的中间代码有后缀式、( )、树等。
三地址码
19.在高级语言源程序中,常需要用户定义的标识符为程序中的对象命名,常见的命名对象有( )。
①关键字(或 保留字) ②变量 ③函数 ④ 数据类型 ⑤注释
首先排除关键字,这是编程语言已经定义好的,用户不能当自己的标识符用
注释不属于。注释是写给程序员看的,在编译时完全被忽略,不需要用标识符来命名。
20.在仅由字符a、b 构成的所有字符串中,其中以 b 结尾的字符串集合可用正规式表示为( )。
这题可以理解为 正则表达式
A (b|ab)*b
b、ab、bb、abab……
不包括有两个以上的a的情况
B (ab*)*b
ab* :a、ab、abb、abbb……
不包括有两个以上的a的情况
C a*b*b:
a*:任意个 a,b*:任意个 b,最后b:再加一个 b,所有 a 都在最前面,然后全是 b,并以 b 结尾。那就不包括bab这种
D (a|b)*b
字符串只能由字符 a、b 组成。必须以 b 结尾。即这类字符串的形式为:
任意长度的 a/b 序列+结尾的 b
21.在以阶段划分的编译中,判断程序语句的形式是否正确属于( )阶段的工作。
语法分析
22.算术表达式采用后缀式表示时不需要使用括号,使用(栈 )就可以方便地进行求值。a-b*(c+d)(其中,-、+、*表示二元算术运算减、加、乘)的后缀式为( 23 ),与该表达式等价的语法树为( 24 )。
a b c d+*-
这里注意 先是-,然后因为*优先级高,所以两者都存入栈,最后遇到括号里的加号先输出

25.在下列机制中,( 25 )是指过程调用和响应调用所需执行的代码在运行时加以结合;而( 26 )是过程调用和响应调用所需执行的代码在编译时加以结合。
编译时定 = 静态绑定;运行时定 = 动态绑定。
A消息传递
B类型检查
C静态绑定 编译时就确定调用哪个函数(如 C 的普通函数调用、C++ 的非虚函数)。
D动态绑定 运行时才确定调用哪个函数(如 C++ 的虚函数、Java 的方法重写)。
26.以下关于编译和解释的叙述中,正确的为( )。
① 编译是将高级语言源代码转换成目标代码的过程
② 解释是将高级语言源代码转换为目标代码的过程
③ 在编译方式下,用户程序运行的速度更快
④ 在解释方式下,用户程序运行的速度更快 边解释边运行更慢
27.函数调用和返回控制是用( 栈)实现的。
函数层层调用、按序返回,正是一个压栈与弹栈的过程。
28.通用的高级程序设计语言一般都会提供描述数据、运算、控制和数据传输的语言成分,其中,控制包括顺序、( )和循环结构。
A选择
29.以下程序设计语言中,( PHP )更适合用来进行动态网页处理。
30.引用调用方式下进行函数调用,是将( )。
B实参的地址传递给形参
31.编译程序对高级语言源程序进行编译的过程中,要不断收集、记录和使用源程序中一些相关符号的类型和特征等信息,并将其存入( )中。
A符号表:符号表 是编译器在编译过程中用来记录源程序中各种标识符(变量名、函数名、类型名等)相关信息的核心数据结构。
D栈和队列 函数调用、表达式求值等才会用到栈
33.34.35.程序设计语言的基本成分包括数据、运算、控制和( 33 )。 数据是程序操作的对象,按照数据组织形式可以分为多种类型,其中枚举属于( 34 )类型;数组属于( 35 )类型。
传输
用户定义,枚举确实是“程序语言自带”的语法,但它属于用户定义类型。因为语言只提供了“枚举”这个工具框架,具体类型是你自己创建的。
构造,数组由基本类型元素构造而成,是构造类型
36.37.在程序设计语言中,( 语用)表示了构成语言的各个记号和使用者的关系,而语境是指理解和实现程序设计语言的环境,包括( 编译)环境和运行环境。
语法 记号之间的形式规则(结构是否正确)
语义 语法成分的含义(这段代码做什么)
语用 记号与使用者之间的关系
编译环境:编译器、链接器等将源代码转化为可执行程序所需的工具和设置
运行环境:程序执行时所需的硬件、操作系统、库支持等
38.在程序编译过程中,执行类型分析和检查是在( )阶段。
A词法分析 识别单词符号(关键字、标识符、常量等),构成记号流
B语法分析 根据语法规则,将记号流组合成语法树,检查结构是否正确
C语义分析 检查语义是否正确,包括类型分析和类型检查、作用域检查等
D代码优化 对中间代码进行等价变换,提高执行效率
39.程序控制结构中,( 选择 )结构提供了在两种或多种分支中选择其中一个的逻辑。
40.( )是一种解释性、面向对象、动态类型的脚本语言。
C Ruby
D JavaScript
javascript并不是严格意义的面向对象语言,而是一种基于对象、事件驱动编程的客户端动态脚本语言。
41.以下关于C语言函数的说法中,不正确的是( )。
A函数是一段具有独立功能的程序单元
B函数是先声明后引用
C函数的定义包括函数首部和函数体
D函数允许嵌套定义
不正确。 在 C 语言中,不允许在函数内部再定义另一个函数,只能嵌套调用,而不能嵌套定义。
42.系统为( )分配的存储空间在程序运行过程中一般是不改变的。
全局变量